您的位置:首页 > 其它

hdu2594 Simpsons’ Hidden Talents kmp next函数的运用

2014-07-24 16:47 381 查看
http://acm.hdu.edu.cn/showproblem.php?pid=2594

题意:给你两个数组,让你求以第一数组前缀 和第二个数组的后缀的最长公共部分。

其实就是对于next函数的使用,先把两个字符串合成一个,然后因为是公共部分,所以next【len】也应该小于第一个和第二个字符串最小长度。

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
char st[1000005],sa[50005];
int next[1000005];
void getnext(char *p)
{
int i,j;
i=0;j=-1;
next[i]=-1;
int len=strlen(p);
while(i<len)
{
if(j==-1||p[i]==p[j])
{
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
}
int main()
{
int n,i,j;
int len,len1,len2;
while(scanf("%s %s",&st,&sa)!=EOF)
{
len1=strlen(st);
len2=strlen(sa);
strcat(st,sa);
getnext(st);
len=strlen(st);
int ans=next[len];
while(ans>len1||ans>len2)
{
ans=next[ans];
}
if(ans!=0)
{
for(i=0;i<ans;i++)
printf("%c",st[i]);
printf(" %d\n",ans);
}
else
printf("%d\n",ans);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: