您的位置:首页 > 其它

ZZULI 1861: 斗破苍穹【回文字符串】

2016-04-12 19:16 519 查看

1861: 斗破苍穹

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 206  Solved: 47

SubmitStatusWeb
Board

Description

有一天, 我们帅气的LC来到加玛帝国. 有时候, 缘分就是这么奇怪, LC和加玛帝国的公主一见钟情, 奈何公主的父王不同意, 因为他觉得LC除了长得特别帅之外, 并没有一技之长.

LC对此呵呵一笑, 他说, 我可是创新实验室走出来的学生, 我会的技能可多着呢, 先说个简单的吧, 只要你给我任意一串字符串, 我就能立马算出这串字符串当中最长回文串的长度. 国王很是吃惊, 说要考一考LC.

于是国王想让你帮忙写一个程序, 用来比对LC的答案, 快来帮帮国王吧!

Input

第一行输入一个T(T <= 50), 表示一共有T组测试数据. 接下来T行, 每行为一组由小写字母组成, 长度不超过10^5的字符串.

Output

每行一个整数X, 表示该组字符串中所包含的最长回文长度.

Sample Input

3

aba

abc

aabaa

Sample Output

3

1

5

思路:回文子串(Manacher)算法

AC-code:

#include<cstdio>
#include<cstring>
int p[200005];
int main()
{
int T,i,len,j,mx,id,sum;
char str[100005],s[200005];
scanf("%d",&T);
while(T--)
{
scanf("%s",str);
len=strlen(str);
s[0]='?',s[1]='#';
for(i=0;i<len;i++)
{
s[2*i+2]=str[i];
s[2*i+3]='#';
}
s[2*i+2]='\0';
mx=0;id=0;
for(j=1;j<2*i+2;j++)
{
if(mx>j)
p[j]=p[2*id-j]>mx-j?mx-j:p[2*id-j];
else
p[j]=1;
while(s[j-p[j]]==s[j+p[j]])
p[j]++;
if(p[j]+j>mx)
{
mx=p[j]+j;
id=j;
}
}
sum=0;
for(i=1;i<j;i++)
sum=sum>p[i]?sum:p[i];
printf("%d\n",sum-1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: