KMP最裸的题目。。。
注意输入的是数字,不是字符。
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int s1[1000001];
int s2[10001];
int p[10001];
int n,m;
void getnext()
{
int j=0;
for (int i=2;i<=m;i++)
{
j=p[i-1];
while (j>0&&s2[j+1]!=s2[i])
j=p[j];
if (s2[j+1]==s2[i])
j=j+1;
p[i]=j;
}
}
int main()
{
int r;
scanf("%d",&r);
while (r--)
{
p[0]=p[1]=0;
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
scanf("%d",&s1[i]);
for (int i=1;i<=m;i++)
scanf("%d",&s2[i]);
getnext();
int j=1,i;
for (i=1;i<=n&&j<=m;i++,j++)
{
if (s1[i]==s2[j])
continue;
j--;
while (s1[i]!=s2[j+1]&&j>0)
j=p[j];
if (s1[i]!=s2[j+1])
j--;
j++;
}
if (j<m)
printf("-1\n");
else
printf("%d\n",i-j+1);
}
}