hdu2594 Simpsons’ Hidden Talents

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2594

思路:

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

KMP算法的简单应用;

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

代码:

 1 #include<cstring>
 2 #include<cstdlib>
 3 #include<cstdio>
 4 #include<iostream>
 5 using namespace std;
 6 const int maxn=50010;
 7 int n;
 8 int f[maxn*2];
 9 char s1[maxn*2];
10 char s2[maxn*2];
11 void callfail()
12 {
13     int j=0,k=-1;
14     f[0]=-1;
15     while(j<n)
16     {
17         if(k==-1||s1[j]==s1[k])   j++,k++,f[j]=k;
18         else k=f[k];
19     }
20 }
21 int main()
22 {
23         while(scanf("%s%s",s1,s2)!=EOF)
24         {
25             memset(f,0,sizeof(f));
26             int len1=strlen(s1);
27             s1[len1]='D';
28             s1[len1+1]='\0';
29             strcat(s1,s2);
30             n=strlen(s1);
31             s1[n]='A';
32             n++;
33             s1[n]='\0';
34             callfail();
35             int len=f[n-1];
36             for(int i=0;i<len;i++)
37             cout<<s1[i];
38             if(len>0) cout<<" ";
39             cout<<f[n-1]<<endl;
40         }
41         return 0;
42 }
View Code

 

posted on 2013-08-25 18:23  GyyZyp  阅读(147)  评论(0编辑  收藏  举报

导航