数据结构实验之串三:KMP应用
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
有n个小朋友,每个小朋友手里有一些糖块,现在这些小朋友排成一排,编号是由1到n。现在给出m个数,能不能唯一的确定一对值l和r(l <= r),使得这m个数刚好是第l个小朋友到第r个小朋友手里的糖块数?
输入
首先输入一个整数n,代表有n个小朋友。(0
输出
如果能唯一的确定一对l,r的值,那么输出这两个值,否则输出-1
示例输入
5 1 2 3 4 5 3 2 3 4
示例输出
2 4
提示
题面不全,数据范围多少不知
(╯‵□′)╯︵┻━┻,用小号测试了一下数据范围大概是2000000的样子,数组用int,用char不知为什么不对。
来源
windream
示例程序
#include <stdio.h>
int next[2000000],t,ch[2000000],ch1[2000000];
void getnext(int m)
{
int i=0,i1=-1;
next[i]=-1;
while(i<m)
{
if(i1==-1||ch1[i]==ch1[i1])
{
i++;
i1++;
next[i]=i1;
}
else
{
i1=next[i1];
}
}
}
int kmp(int t,int n,int m)
{
int i=t,i1=0;
while(i<n&&i1<m)
{
if(i1==-1||ch[i]==ch1[i1])
{
i++;
i1++;
}
else
{
i1=next[i1];
}
}
if(i1==m)
{
return i-m+1;
}
else
{
return -1;
}
}
int main()
{
int n,i,m;
scanf("%d",&n);
for(i=0; n>i; i++)
{
scanf("%d",&ch[i]);
}
scanf("%d",&m);
for(i=0; m>i; i++)
{
scanf("%d",&ch1[i]);
}
getnext(m);
t=kmp(0,n,m);
if(t!=-1)
{
if(kmp(t,n,m)==-1) //是否唯一
{
printf("%d %d",t,t+m-1);
}
else
{
printf("-1");
}
}
else
{
printf("-1");
}
return 0;
}
/**************************************
Problem id : SDUT OJ 3311
Code Len : 1189B
Result : Accepted
Take Memory : 4960K
Take Time : 120MS
Submit Time : 2016-07-20 09:26:24
**************************************/