|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include<stdio.h>
#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。 |
|