AFO

manacher

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]);
    }
}

秩序魔咒

posted @ 2018-11-30 10:19  ZUTTER☮  阅读(125)  评论(0编辑  收藏  举报