|  | 
 
| 
#include<stdio.h>
x
马上注册,结交更多好友,享用更多功能^_^您需要 登录 才可以下载或查看,没有账号?立即注册  #include<string.h>
 char S[100001];
 int next1[100001];
 int next2[100001];
 char TS[100001];
 int found_next()
 {
 int i=0,j=-1,t=0;
 next1[0]=-1;
 next2[0]=-1;
 int m=strlen(S);
 for(i=m-1;i>=0;i--)
 {
 TS[t]=S[i];
 t++;
 }
 int max=0 ,mid=0,tmax=0;
 i=0;
 while(i<m)
 {
 if(j==-1||TS[i]==TS[j])
 {
 next1[++i]=++j;
 if(next1[i]>max) {max=next1[i];}
 }
 else j=next1[j];
 }
 i=0,j=-1;
 while(i<m)
 {
 if(j==-1||S[i]==S[j])
 {
 next2[++i]=++j;
 if(next2[i]>tmax) {tmax=next2[i];}
 }
 else j=next2[j];
 }
 mid=next2[tmax];
 if(mid<0||m-2*mid<=0) mid=0;
 int X;
 X=max-mid*2+m;
 return X;
 }
 int main ()
 {
 while(scanf("%s",S)!=EOF)
 {
 int n=0;
 n=found_next();
 printf("%d\n",n);
 }
 return 0;
 }
 波比和哈丽在玩一个字母游戏,波比给出一个字符串S,要求哈丽按照一定规则,基于该字符串算出一个数字X。
 
 规则是:
 
 (1)求出S的最长重复后缀P(P是S的后缀且在S中出现大于1次,例如yacbacba的最长重复后缀是acba),
 
 (2)求出在S中去除第二长相等前后缀(S中所有相等的前后缀中第2长者,例如abcabcxxxabcabc中最长相等前后缀是abcabc,第二长的相等前后缀则是abc)后剩下的子串Q(例如abcabcxxxabcabc去除第二长相等前后缀后,剩下abcxxxabc)。
 
 则X=P的长度+Q的长度。
 
 注意一个字符串不能称为自己的前缀或后缀。子串Q至少为空串,其长度大于等于0,不能为负数。
 
 请编写程序帮助哈丽根据给定字符串S,根据上述规则计算出数字X。
 | 
 |