1861: 斗破苍穹

来源:互联网 发布:mac os beta 编辑:程序博客网 时间:2024/04/28 19:48

1861: 斗破苍穹

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 199  Solved: 43

SubmitStatusWeb Board

Description

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

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

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

Input

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

Output

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

Sample Input

3abaabcaabaa

Sample Output

315



#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<cmath>using namespace std;char a[100100];char s[100100<<1];int p[100100<<1];int ans;void Manacher(){int l,i;l=strlen(a);for( i=0;i<(l+1)<<1;i++){s[i]='#';p[i]=0;}for(i=0;i<l;i++)s[(i+1)<<1]=a[i];s[(i+1)<<1]=0;int mx,id;mx=0;id=0;for( i=1;s[i]!=0;i++){p[i]=1;if(mx>i)        p[i]=min(mx-i,p[(id<<1)-i]);while(s[i-p[i]]==s[i+p[i]])++p[i];if(i+p[i]>mx){mx=i+p[i];id=i;}if(ans<p[i]-1)ans=p[i]-1;}}int main(){int t;scanf("%d",&t);while(t--){scanf("%s",a);ans=0;Manacher();printf("%d\n",ans);}return 0;}


0 0
原创粉丝点击