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]即为最大的匹配数,是不是很简单啊!!!至于中间和后面为什么加大些字母,留给读者自己思考咯
代码:
View Code
思路:
其实就是求相同的最长前缀与最长后缀
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
相关文章推荐
- HDU2594 Simpsons’ Hidden Talents
- 【hdu2594】Simpsons’ Hidden Talents——KMP
- HDU2594 Simpsons’ Hidden Talents(KMP)
- hdu2594-Simpsons’ Hidden Talents
- hdu2594 Simpsons’ Hidden Talents(KMP)
- HDU2594 Simpsons’ Hidden Talents(kmp,next的性质)
- HDU2594 Simpsons’ Hidden Talents【KMP】
- HDU2594 Simpsons’ Hidden Talents 【KMP】
- HDU2594 Simpsons’ Hidden Talents
- hdu2594 Simpsons’ Hidden Talents
- HDU2594 Simpsons’ Hidden Talents 字符串哈希
- (kmp中级) HDU2594 (Simpsons’ Hidden Talents)
- HDU2594 Simpsons’ Hidden Talents (kmp找寻两串s1,s2中相同的部分)
- HDU2594 Simpsons’ Hidden Talents(KMP)
- HDU2594 Simpsons’ Hidden Talents
- [hdu2594]Simpsons’ Hidden Talents
- HDU2594:Simpsons’ Hidden Talents
- HDU2594-Simpsons’ Hidden Talents
- hdu2594 Simpsons’ Hidden Talents(KMP,前后缀)
- hdu2594 Simpsons’ Hidden Talents(KMP)