Manacher模板

还是一个很短很简单的模板~

Ac Code

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int len;
char s[11000005];
char s2[22000005];
int f[22000005];
int edge=1;
void read()
{
	scanf("%s",s);
	len=strlen(s);
	s2[0]='!';
	s2[1]='#';
	
	for(int i=2;i<=len+1;i++)
	{
		edge++;
		s2[edge]=s[i-2];
		edge++;
		s2[edge]='#';
	}
}
void manacher()
{
	int mid=1;
	f[1]=1;
	for(int i=2;i<=edge;i++)
	{
		f[i]=min(f[mid*2-i],f[mid]+mid-i);
		while(f[i]+i<=edge&&s2[i+f[i]]==s2[i-f[i]])
		f[i]++;
		if(f[i]+i>f[mid]+mid)mid=i;
	}
}
void print()
{
	int maxx=-1;
	for(int i=2;i<=edge;i++)
	if(f[i]-1>maxx)maxx=f[i]-1;
	printf("%d",maxx);
}
int main()
{
	read();	
	manacher();
	print();
	return 0;
}

 

posted @ 2018-07-22 17:12  Richardluan  阅读(1)  评论(0)    收藏  举报