manacher
处理回文字符串问题
一
回文串是有奇偶的,而偶的回文串没有对称轴
所以要暴力把偶回文串改成奇回文串
A | B | C | ||||
---|---|---|---|---|---|---|
# | A | # | B | # | C | # |
就像这样↑
这样就可以保证无论是奇回文还是偶回文都会有一个对称轴
二
如果一个点已经扩展完了
那它右边的点可以用与其对称的那个点来更新它自己
但是如果它的对称点的长度超过了(L),那就只能扩展到(L)
然后再暴力枚举扩展就行啦
这样的时间复杂度就是(O(n))的
void manacher(char* s)
{
int l=strlen(s),mid=0,r=0;
char c[1001];
c[1]='#';
for(int i=1;i<=l;i++)
{
c[i*2]=s[i];
c[i*2+1]='#';
}
for(int i=1;i<=l;i++)
{
p[i]=r>i ? min(p[2*mid-i],r-i):1;
while(c[i+p[i]]==c[i-p[i]]) p[i]++;
if(r<i+p[i]) r=i+p[i], mid=i;
ans=max(ans, p[i]);
}
}