#include<stdio.h>
#include<string.h>
int n,m;
int a[10000010];
int b[10000010];
void get_nextval(int pattern[],int next[])
{
int j=0,k=-1;
next[0]=-1;
while(j<m)
{
if(k==-1||pattern[j]==pattern[k])
{
j++;
k++;
next[j]=k;
}
else
k=next[k];
}
}
int kmp(int text[],int pattern[])
{
int index=0,i=0,j=0;
if(n==0||m==0)return -1;
//int len=strlen(pattern);
int next[m+1];
get_nextval(pattern,next);
while(i<n&&j<m)
{
if(text[i]==pattern[j])
{
i++;
j++;
}
else
{
index+=j-next[j];
if(next[j]!=-1)
j=next[j];
else
{
j=0;
i++;
}
}
}
if(j==m)
return index+1;
else return -1;
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=0; i<n; i++)
scanf("%d",&a[i]);
scanf("%d",&m);
for(int i=0; i<m; i++)
scanf("%d",&b[i]);
int k=kmp(a,b);
if(k!=-1)
{
int j=kmp(a+k,b);
if(j==-1)
printf("%d %d\n",k,k+m-1);
else
printf("-1\n");
}
else
printf("-1\n");
}
}
SDUT数据结构实验之串三:KMP应用
最新推荐文章于 2018-05-27 11:29:07 发布