manacher ——学习

回文串

形如aaa,aa,aba之类的就是回文串,字符串关于某个位置中心对称。反之,abcd不为回文串
对于字符串str,现有个O(n)范围求出以每个位置为中心的最长回文半径——manacher

manacher

正常的求每个位置的最长回文半径,我们用暴力,复杂度是O( n 2 n^{2} n2),但是我们发现,在前面求出的半径可以拿来使用求后面的半径,从而减少一定时间。
先贴个代码,图后补

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N = 22000000 + 5;
int p[N];
int manacher(string s)
{
    string t = "$#";
    for(int i = 0; s[i]; i ++)
    {
        t += s[i];
        t += "#";
    }
    int len = t.length();
    int id = 0, mx = 0, mx_len = 0;
    for(int i = 1; i < len; i ++)
    {
        p[i] = i < mx ? min(mx - i, p[2 * id - i]) : 1;
        while(t[i + p[i]] == t[i - p[i]])
            p[i] ++;
        if(i + p[i] > mx)
        {
            mx = i + p[i];
            id = i;
        }
        mx_len = max(p[i], mx_len);
    }
    return mx_len;
}
int main()
{
    ios::sync_with_stdio(false);
    string s;
    cin >> s;
    cout << manacher(s) - 1 << endl;
}

全部评论

相关推荐

05-30 18:54
武汉商学院 Java
啥都不会1:先投着吧,大概率找不到实习,没实习的时候再加个项目,然后把个人评价和荣誉奖项删了,赶紧成为八股战神吧,没实习没学历,秋招机会估计不多,把握机会。或者说秋招时间去冲实习,春招冲offer,但是压力会比较大
点赞 评论 收藏
分享
04-15 23:42
中山大学 Java
ResourceUtilization:过几天楼主就会捧着一堆offer来问牛友们该怎么选辣
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务