hdu 1711(KMP)
来源:互联网 发布:隆多生涯数据 编辑:程序博客网 时间:2024/06/05 04:15
#include <stdio.h>#include <string.h>int N,M;int a[1000005],b[10005],next[10005];void getnext(){ int k=1,j=0; while(k<M) { if(j==0||b[j]==b[k]) { ++j;++k; if(b[j]==b[k]) next[k]=next[j]; else next[k]=j; } else j=next[j]; }}int kmp(){ int i=0,j=0; while(i<=N&&j<=M) { if(a[i]==b[j]||j==0) {++i;++j;} else j=next[j]; } if(j>M) return i-M; else return -1;}int main(){ int T; scanf("%d",&T); while(T--) { scanf("%d%d",&N,&M); for(int i=1;i<=N;i++) scanf("%d",&a[i]); for(int i=1;i<=M;i++) scanf("%d",&b[i]); getnext(); printf("%d\n",kmp());; }}