hdu1711KMP
http://acm.hdu.edu.cn/showproblem.php?pid=1711
还是套模板,但要注意在函数kmp中while(i<len1&&j<len2)因为这个错了好多次。。。。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define maxn 1000000+5 int s1[maxn],s2[maxn]; int next[maxn]; int len1,len2; void getnext() { int i=0,j=-1; next[0]=-1; while(i<len2) { if(j==-1||s2[i]==s2[j]) { i++,j++; next[i]=j; } else j=next[j]; } } int kmp() { int i=0,j=0; while(i<len1&&j<len2) { if(j==-1||s1[i]==s2[j]) i++,j++; else j=next[j]; } if(j>=len2)return i-len2+1; return 0; } int main() { // #ifndef ONLINE_JUDGE // freopen("in.txt","r",stdin); // #endif // ONLINE_JUDGE int t; scanf("%d",&t); while(t--) { scanf("%d%d",&len1,&len2); for(int i=0;i<len1;i++) scanf("%d",&s1[i]); for(int j=0;j<len2;j++) scanf("%d",&s2[j]); memset(next,0,sizeof(next)); getnext(); int flag=kmp(); if(flag!=0)printf("%d\n",kmp()); else printf("-1\n"); } return 0; }

浙公网安备 33010602011771号