KMP模板题,链接:点击打开链接
基本没有什么变化,如果硬说有的话,就是把字母变成了数字。输入时请注意scanf,这个题估计输入规模极大。。cin会TLE的。。
2AC(第一次用cin了):
#include <iostream>
#include <stdio.h>
using namespace std;
int next[10005];
int a[1000005];
int b[10005];
void build_next(int b[],int bnum)
{
int i,j=0;
memset(next,0,sizeof(next));
for(i=1;i<bnum;i++)
{
j=next[i-1];
while(j==1 && b[i]!=b[j])
{
j=next[j-1];
}
if(b[j]==b[i])
{
next[i]=j+1;
}
else
next[i]=0;
}
}
int KMP_Find(int s[],int t[],int pos,int m,int n)
{
build_next(t,n);
int i=pos;
int j=0;
for(i=pos;i<m;i++)
{
while(j>0 && s[i]!=t[j])
{
j=next[j-1];
}
if(s[i]==t[j])
{
j++;
}
else
{
j=0;
}
if(j==n) //目标串匹配结束
{
return i-n+1;
}
}
return -1;
}
int main()
{
int testcase;
cin>>testcase;
while(testcase--)
{
int nnum,mnum;
cin>>mnum>>nnum;
for(int i=0;i<mnum;i++)
{
scanf("%d",&a[i]);
}
for(int j=0;j<nnum;j++)
{
scanf("%d",&b[j]);
}
int lg=KMP_Find(a,b,0,mnum,nnum);
if(lg==-1)
{
cout<<"-1"<<endl;
}
else
{
cout<<lg+1<<endl;
}
}
return 0;
}