HDU1711 模板题-KMP

来源:互联网 发布:企搜通软件 编辑:程序博客网 时间:2024/05/20 20:02

没啥好说的... 直接上代码

#include<cstdio>#include<cstring>using namespace std;int s1[1000006],s2[10004];int nt[10004];int n,m,t;void init(int *s,int *nt,int size){int i=0,j=-1;nt[0]=-1;while(i<size){if(j==-1 || s2[i]==s2[j]) nt[++i]=++j;else j=nt[j];}}int main(){scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);for(int i=0;i<n;i++) scanf("%d",&s1[i]);for(int i=0;i<m;i++) scanf("%d",&s2[i]);init(s2,nt,m);int i=0,j=0;while(i<n && j<m){if(j==-1 || s1[i]==s2[j]) ++i,++j;else j=nt[j];}if(j==m) printf("%d\n",i-m+1);else printf("%d\n",-1);}return 0;}