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 }