1. 程式人生 > >最長迴文串-manacher演算法模板

最長迴文串-manacher演算法模板

給出一個只由小寫英文字元a,b,c...y,z組成的字串S,求S中最長迴文串的長度. 
迴文就是正反讀都是一樣的字串,如aba, abba等

Input

輸入有多組case,不超過120組,每組輸入為一行小寫英文字元a,b,c...y,z組成的字串S 
兩組case之間由空行隔開(該空行不用處理) 
字串長度len <= 110000

Output

每一行一個整數x,對應一組case,表示該組case的字串中所包含的最長迴文長度. 

Sample Input

aaaa

abab

Sample Output

4
3
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=3e5+10;
char s[maxn],str[maxn];
int len1,len2,ans,p[maxn];
void init()
{
	str[0]='$';
	str[1]='#';
	for(int i=0;i<len1;i++)
	{
		str[2*i+2]=s[i];
		str[2*i+3]='#';
	}
	len2=len1*2+2;
	str[len2]='*';
}

void manacher()
{
	int id=0,mx=0;
	for(int i=1;i<len2;i++)
	{
		if(mx>i) p[i]=min(p[2*id-i],mx-i);
		else p[i]=1;
		for(;str[i+p[i]]==str[i-p[i]];p[i]++)
		if(p[i]+i>mx)
		{
			mx=p[i]+i;
			id=i;
		}
	}
}
int main()
{
	while(~scanf("%s",s))
	{
		len1=strlen(s);
		init();
		manacher();
		
		ans=0;
		for(int i=0;i<len2;i++)
		 ans=max(ans,p[i]);
		 printf("%d\n",ans-1);
	}
}