manacher 板子

因为各位大佬的manacher板子实现上相差甚远
小蒟蒻整合了一个相对好写的板子以便日后复习
这里的回文半径 均为从位置 \(i\) 到回文串最右端位置包含的字符个数,也即包含位置i

int n;
char s[N], t[N], *c;
int d[N], ans;
scanf("%s", t); c=t;
s[++n]='$'; s[++n]='#';
while (*c) s[++n]=*(c++), s[++n]='#';
for (int i=1,mid=0,r=0; i<=n; ++i) {
	if (i<=r) d[i]=min(d[mid*2-i], r-i+1);
	while (s[i-d[i]]==s[i+d[i]]) ++d[i];
	if (i+d[i]-1>r) r=i+d[i]-1, mid=i;
	ans=max(ans, d[i]);
}
printf("%d\n", ans-1);
posted @ 2021-12-09 08:54  Administrator-09  阅读(48)  评论(0编辑  收藏  举报