【链接】
hdu3068
【题目大意】
Manacher模板裸题。
【解题报告】
Manacher模板裸题。
#include<cstdio>
#include<cstring>
#define min(x,y) (x)<(y)?(x):(y)
#define max(x,y) (x)>(y)?(x):(y)
using namespace std;
const int maxn=110005,maxm=220005;
int p[maxm];
char s[maxn],c[maxm];
bool Sread(char *s)
{
char ch=getchar(); int len=1;
while (ch<'a'||ch>'z') {if (ch==EOF) return 0; ch=getchar();}
while (ch>='a'&&ch<='z') s[len++]=ch,ch=getchar(); s[len]='\0';
return 1;
}
int Manacher(char *s)
{
int len=strlen(s+1);
for (int i=1; i<=len; i++) c[2*i-1]='~',c[2*i]=s[i]; c[len=2*len+1]='~';
int Pos=0,R=0,MAX=0;
for (int i=1; i<=len; i++)
{
if (i<R) p[i]=min(p[2*Pos-i],R-i); else p[i]=1;
while (1<=i-p[i]&&i+p[i]<=len&&c[i-p[i]]==c[i+p[i]]) p[i]++;
if (i+p[i]>R) {R=i+p[i]; Pos=i;}
MAX=max(MAX,p[i]-1);
}
return MAX;
}
int main()
{
freopen("3068.in","r",stdin);
freopen("3068.out","w",stdout);
while (Sread(s)) printf("%d\n",Manacher(s));
return 0;
}