题目描述
输入
输出
示例输入
5 1 2 3 4 5 3 2 3 4
示例输出
2 4
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define max 1000000
int m,n;
int next[max];
int s1[max],s2[max];
void get_next(int s2[],int next[])
{
int i=1;
next[1]=0;
int j=0;
while(i<m)
{
if(j==0||s2[i]==s1[j])
{
i++;j++;
next[i]=j;
}
else
j=next[j];
}
}
void Index_KMP(int n,int m)
{
int pos=1,j=1,k=0,a;
while(pos<=n&&j<=m)
{
if(j==0||s1[pos]==s2[j])
{
pos++;j++;
}
else
j=next[j];
if(j>m)
{
j=1;k++;
if(k==1)
{
a=pos;
}
}
}
if(k==1)
{
printf("%d %d\n",a-m,a-1);
}
else
printf("-1\n");
}
int main()
{
int n,m,i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&s1[i]);
scanf("%d",&m);
for(j=1;j<=m;j++)
scanf("%d",&s2[j]);
get_next(s2,next);
Index_KMP(n,m);
return 0;
}
本文介绍了一种使用KMP算法解决特定问题的方法:给定一组小朋友拥有的糖果数量序列和另一组目标糖果数量序列,如何判断目标序列是否为原序列的连续子序列,并找到该子序列的位置。
631

被折叠的 条评论
为什么被折叠?



