北京林业大学“计蒜客”杯程序设计竞赛 网络赛 G. 易彰彪的一张表

题目回忆版:
小白得到一张n*m的字母表,他想要知道是否存在一个给定的字符串是字母表转化为一维字符串的子串。【1《n,m《100】

【数据】:
5 5
asdff
etrtb
serfd
awede
btyud
asdffetrtbser
YES
【思路】:暴力模拟
【代码】:

#include <bits/stdc++.h>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int maxn = 1e6+10;
const int maxm = 233;
const LL MOD = 999999997;
inline LL read()
{
    int  c=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        c=c*10+ch-'0';
        ch=getchar();
    }
    return c*f;
}

int gcd(int a,int b)
{
    return b==0?a:gcd(b,a%b);
}

int Eular(int n)
{
    int ret =1;
    for(int i=2; i*i<=n; ++i)
    {
        if(n%i==0)
        {
            ret *= (i-1);
            n/=i;
            while(n%i==0)
            {
                ret*=i;
                n/=i;
            }
        }
    }
    if(n>1) ret*=(n-1);
    return ret;
}

int Get_divisor_sum(int n)
{
    int sum=0;
    for(int i=2; i*i<=n; ++i)
    {
        if(n%i==0)
        {
            sum+=i;
            if(n/i!=i) sum+=n/i;
        }
    }
    sum++;
    return sum;
}

LL Quick_Mod(LL a,LL b,LL MOD)
{
    LL ans=a,ret=1;
    while(b)
    {
        if(b&1) ret = ret*ans%MOD;
        b>>=1;
        ans=ans*ans%MOD;
    }
    return ret;
}

char str[maxm][maxm];
char str2[maxm*maxm];
char res[maxm*maxm];
int Next[maxn];
int cnt;
int main()
{
    int n,m;
    freopen("1.txt","r",stdin);
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(str,0,sizeof(str));
        memset(str2,0,sizeof(str2));
        memset(res,0,sizeof(res));
        for(int i=0; i<n; i++) scanf("%s",str[i]);
        scanf("%s",str2);
        int str2_len=strlen(str2);
        for(int i=0; i<str2_len; ++i)  str2[i]=toupper(str2[i]);
        int cntt=0;
        for(int i = 0; i < n; i++)
        {
            for(int j=0; j<m; ++j)
            {
                str[i][j]=toupper(str[i][j]);
                res[cntt++]=str[i][j];
            }
        }
        cnt=0;
        int flag=0;
        for(int i=0; i<cntt; i++)
        {
            char tt[10000];
            memset(tt,0,sizeof(tt));
            int lent=0;
            for(int j=i; j<str2_len+i; j++) //find the length of str2
            {
                tt[lent++]=res[j];
            }
            if(strcmp(tt,str2)==0)
            {
                flag=1;
                break;
            }
        }
        if(flag) puts("YES");
        else puts("NO");
    }
    return 0;
}

【另外一种思路KMP】
【代码】:

#include <bits/stdc++.h>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int maxn = 1e6+10;
const int maxm = 233;
const LL MOD = 999999997;

int Next[100000],cnt;
char s1[maxm][maxm],s2[maxm],p[maxm];
void getnext(int len)
{
    Next[0]=-1;
    int j=0;
    int k=-1;
    while(j<len-1)
    {
        if((k==-1)||(p[j]==p[k]))
        {
            j++;
            k++;
            if(p[j]!=p[k])
                Next[j]=k;
            else
                Next[j]=Next[k];
        }
        else
            k=Next[k];
    }
}
void kmp(int slen,int plen)
{
    int i=0,j=0;
    getnext(plen);
    while (i<slen)
    {
        if(j==-1||s2[i]==p[j])
        {
            i++;
            j++;
        }
        else
        {
            j=Next[j];
        }
        if(j==plen)
        {
            cnt++;
            j=Next[j];
        }
    }
}

int main()
{
  // freopen("1.txt","r",stdin);
    int n,slen,plen,m,i,j;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        int ll=0;
        for (int i=0; i<n; i++)
            for(int j=0; j<m; j++)
            {
                cin>>s1[i][j];
                s2[ll++]=s1[i][j];
            }
        getchar();
        gets(p);
        slen=strlen(s2);
        plen=strlen(p);
        cnt=0;
        for(int i = 0; i < slen; i++)
            s2[i] = toupper(s2[i]);
        for(int i = 0; i < plen; i++)
            p[i] = toupper(p[i]);
        kmp(slen,plen);
        if(cnt==0) puts("NO");
        else puts("YES");
    }
    return 0;
}

你可能感兴趣的:(字符串,模拟,KMP)