虽然看的有点凌乱但是大概知道它是怎么搞得了,只是简单的了解了子串自我匹配的过程,和与模串匹配的过程,所以写了一下代
带你去找它 ~
码。
#include<stdio.h>
#include<string.h>
int next[10005],n,m;
int a[1000005],b[10005];
void getnext()
{
int i,j=0;
next[1]=0;
for(i=2;i<=m;i++)
{
while(j>0&&b[i]!=b[j+1])
j=next[j];
if(b[i]==b[j+1])
j+=1;
next[i]=j;
}
}
int kmp()
{
int i,j=0;
for(i=1;i<=n;i++)
{
while(j>0&&a[i]!=b[j+1])
j=next[j];
if(a[i]==b[j+1])
j++;
if(j==m)
return i-m+1;
}
return 0;
}
int main()
{
int t,i,j;
scanf("%d",&t);
while(t--)
{
memset(next,0,sizeof(next));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=m;i++)
scanf("%d",&b[i]);
getnext();
if(!kmp())
puts("-1");
else
printf("%d\n",kmp());
}
return 0;
}
码。