1711 Number Sequence
题意:KMP模板题,找出短串在长串的匹配到的最近位置
KMP这里略了,需要请参考
http://www.cppblog.com/oosky/archive/2006/07/06/9486.html
http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html
#include<iostream>
using namespace std;
int a[1000000 + 10];
int next[1000000 + 10];
int b[10000 + 10];
int n,m;
void getnext()//求next数组
{
int i=1,j=0;
next[1]=0;
while(i<m)
{
if(j==0||b[i]==b[j])
{
++i;++j;
next[i]=j;
}
else
j=next[j];
}
}
int kmp()//通过next数组找出最近位置
{
int i=1,j=1;
while(i<=n&&j<=m)
{
if(j==0||a[i]==b[j])
{
++i;++j;
}
else
j=next[j];
}
if(j>m)
return i-m;
return 0;
}
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 j = 1; j<=m; j++)
scanf("%d", &b[j]);
getnext();
int ans = kmp();
if(ans) cout<<ans<<endl;
else cout<<-1<<endl;
}
return 0;
}