数据结构实验之串三:KMP应用
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
输入
输出
示例输入
5 1 2 3 4 5 3 2 3 4
示例输出
2 4
这道题考察的也是kmp算法,不过,需要注意的是:求得是唯一的一对l和r,需要再加一个判断,看是否是唯一存在的即可。
代码如下:
#include <stdio.h>
#include <string.h>
int next[10000005];
int a[10000005],b[10000005];
void get_next(int b[],int next[],int len){
int i,j;
i=0;
j=-1;
next[0]=-1;
while(i<len-1){
if(j==-1||b[i]==b[j]){/*b[i]表示前缀字符,b[j]表示后缀字符*/
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
}
int kmp(int a[],int b[],int x,int y){
int i,j;
i=0;
j=0;
memset(next,0,sizeof(next));
get_next(b,next,y);
while(i<x&&j<y){
if(j==-1||a[i]==b[j]){
i++;
j++;
}
else
j=next[j];//j值退回到合适的位置,i值不变;
}
if(j>=y)
return i-j+1;//若b[]是a[]的字串,返回b[]在a[]第一次出现的位置;
else
return -1;
}
int main(){
int m,n,i,j,k;
while(scanf("%d",&n)!=EOF){
for(i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
for(i=0;i<m;i++)
scanf("%d",&b[i]);
k=kmp(a,b,n,m);
if(k!=-1){/*判定是否存在唯一对l和r*/
int t=kmp(a+k,b,n,m);
if(t==-1)
printf("%d %d\n",k,k+m-1);
else
printf("-1\n");
}
else
printf("-1\n");
}
return 0;
}