zzulioj1861(最長迴文子串)

1861: 鬥破蒼穹

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 246  Solved: 64

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

HINT

Source

//zzulioj1861(迴文串)
//題目大意:給你一列字符串,求出這列串中最長的迴文子串.
//解題思路:Manacher算法求最長迴文串. 
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; 
char s[100010],str[10000010];
int p[10000010];
int Manacher(int len)
{
	int mx=0,id=0,i,maxl=0;
	for(i=1;i<len;i++)
	{
		if(mx>i)
		{
			p[i]=min(p[2*id-i],mx-i);
		}
		else
		{
			p[i]=1;
		}
		while(str[i-p[i]]==str[i+p[i]])
		 p[i]++;
		if(i+p[i]>mx)
		{
			mx=i+p[i];
			id=i;
		}
	}
	for(i=1;i<len;i++)
	{
		if(maxl<p[i]) maxl=p[i];
	}
	return maxl;
}
int main()
{
	int i,j,k,len,t;
	scanf("%d",&t);
	getchar();
	while(t--)
	{
		scanf("%s",s);
		k=strlen(s);
		str[0]='@';
	    for(i=0,j=1;i<k;i++)
	    {
		  str[j]='#';
		  j++;
		  str[j]=s[i];
		  j++;
	    }
	    str[j]='#';
	    len=2*k+1;
	    int result=Manacher(len);
	    printf("%d\n",result-1);
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章