CF 8 A
对KMP的熟练使用
View Code
我的代码 kmp匹配过去,需要熟练掌握KMP,数据范围大一点也没关系 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 100010; int n,mb,mc; char a[maxn],b[maxn],c[maxn]; int p1[maxn],p2[maxn]; void getp(int p[],int m,char b[]){ p[1]=0; int i,j=0; for(i=2;i<=m;i++){ while(j>0&&b[j+1]!=b[i]) j=p[j]; if(b[j+1]==b[i]) j+=1; p[i]=j; } } int kmp(int i,int p[],int m,char b[]){ int j=0; for(;i<=n;i++){ while(j>0&&b[j+1]!=a[i]) j=p[j]; if(b[j+1]==a[i]) j+=1; if(j==m){ return i; } } return -1; } int main(){ scanf("%s",a+1); n=strlen(a+1); int flag=0; scanf("%s",b+1);mb=strlen(b+1);getp(p1,mb,b); scanf("%s",c+1);mc=strlen(c+1);getp(p2,mc,c); int t=kmp(1,p1,mb,b); if(t!=-1 && t<n && kmp(t+1,p2,mc,c)!=-1) flag|=1; reverse(a+1,a+1+n); t=kmp(1,p1,mb,b); if(t!=-1 && t<n && kmp(t+1,p2,mc,c)!=-1) flag|=2; const char* ans[]={"fantasy","forward","backward","both"}; puts(ans[flag]); return 0; } 网上的代码 用strstr,数据范围较大的情况可能效率就差了 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; char s[100500],a[200],b[200]; int main(){ int n=strlen(gets(s)); int x=strlen(gets(a)); int y=strlen(gets(b)); int flag=0; if(strstr(s,a) && strstr(strstr(s,a)+x,b)) flag|=1; reverse(s,s+n); if(strstr(s,a) && strstr(strstr(s,a)+x,b)) flag|=2; const char* ans[]={"fantasy","forward","backward","both"}; puts(ans[flag]); }