您的位置:首页 > 其它

hdu2594 Simpsons’ Hidden Talents

2013-08-25 18:23 316 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2594

思路:

其实就是求相同的最长前缀与最长后缀

KMP算法的简单应用;

假设输入的两个字符串分别是s1,s2。s1后面再上一个任意的大写字母,然后再将串s2连在s1的后面,再在后面加上一个任意的大写字母(注意应该与前面所加的字母不同),那么对当前的s1串求其失败函数f,那么f[n-1]即为最大的匹配数,是不是很简单啊!!!至于中间和后面为什么加大些字母,留给读者自己思考咯

代码:

#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<iostream>
using namespace std;
const int maxn=50010;
int n;
int f[maxn*2];
char s1[maxn*2];
char s2[maxn*2];
void callfail()
{
int j=0,k=-1;
f[0]=-1;
while(j<n)
{
if(k==-1||s1[j]==s1[k])   j++,k++,f[j]=k;
else k=f[k];
}
}
int main()
{
while(scanf("%s%s",s1,s2)!=EOF)
{
memset(f,0,sizeof(f));
int len1=strlen(s1);
s1[len1]='D';
s1[len1+1]='\0';
strcat(s1,s2);
n=strlen(s1);
s1
='A';
n++;
s1
='\0';
callfail();
int len=f[n-1];
for(int i=0;i<len;i++)
cout<<s1[i];
if(len>0) cout<<" ";
cout<<f[n-1]<<endl;
}
return 0;
}


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