您的位置:首页 > 其它

hihocoder 1032(manacher)

2017-11-09 19:46 323 查看
传送门

模板题。

P.S.差点把mx(最远点)取成min,所以以后'>','<'一定要想清楚再写。。。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e6+4;
char a
,b[N<<1];
int p[N<<1];
inline void manacher(char *a) {
int n=strlen(a);
b[0]='$';
for (register int i=0;i<n;++i)
b[i<<1|1]='#',b[(i<<1)+2]=a[i];
b[n=n<<1|1]='#';
int id=0,mx=0,ret=0;
for (register int i=1;i<=n;++i) {
p[i]=mx>i?min(p[(id<<1)-i],mx-i):1;
while (b[i+p[i]]==b[i-p[i]]) ++p[i];
if (mx<i+p[i]) mx=i+p[i],id=i;
ret=max(ret,p[i]-1);
}
printf("%d\n",ret);
}
int main() {
int kase;
scanf("%d",&kase);
while (kase--) {
scanf("%s",a);
manacher(a);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  manacher