学习了kmp算法,理解了算法思想,但还没有到能把这个思想用语言来描述出来。
#include<bits/stdc++.h> #define clr(a,b) memset(a,b,sizeof(a)) using namespace std; typedef long long ll; const int maxn=1000100; int a[maxn],b[maxn],f[maxn]; int n,m; void fail(){ f[0]=-1; for(int j=1;j<m;j++) { for(int i=f[j-1];;i=f[i]){ if(b[j]==b[i+1]){ f[j]=i+1; break; }else if(i==-1){ f[j]=-1; break; } } } } int kmp(){ fail(); int i=0,j=0; while(i<n&&j<m){ if(a[i]==b[j]){ i++,j++; }else if(j==0){ i++; }else{ j=f[j-1]+1; } } // printf("i:%d j:%d ",i,j); return j==m?i-m+1:-1; } int main(){ int T; cin>>T; while(T--) { cin>>n>>m; for(int i=0;i<n;i++)scanf("%d",&a[i]); for(int j=0;j<m;j++)scanf("%d",&b[j]); printf("%d ",kmp()); } }