题目链接:http://lightoj.com/volume_showproblem.php?problem=1258
就是求逆串和原串的匹配长度
答案就是原串长度的2倍减去匹配长度即可
第一次我将原串接在逆串后面然后一次求失败函数得当前串的f[len1](假设当前总串长度为len1)那么答案即为了len1-f[len1],如果f[len1]>=len ,那么答案为len
但是wrong了,,不知道原因
第二次就直接匹配原串和逆串然后就AC了
我把错误代码和正确代码都贴出来,有时间再思考为什么第一个方法错吧,有哪位朋友看到也可以指导,谢啦
错误代码:
1 #include<iostream> 2 #include<cstdlib> 3 #include<cstdio> 4 #include<cstring> 5 #define maxn 1000005 6 using namespace std; 7 char s[maxn]; 8 char s1[maxn*2]; 9 int len; 10 int len1; 11 int f[maxn*2]; 12 void callfail() 13 { 14 int i,j=0,k=-1; 15 f[0]=-1; 16 while(j<len1) 17 { 18 if(k==-1 || s1[j]==s1[k]) 19 { 20 k++;j++; 21 f[j]=k; 22 } 23 else k=f[k]; 24 } 25 } 26 int main() 27 { 28 int t; 29 while(scanf("%d",&t)!=EOF) 30 { 31 int iCase=1; 32 while(t--) 33 { 34 printf("Case %d: ",iCase++); 35 s[0]='