• bzoj2565


    manacher

    先用manacher求出p数组,f[i]表示以i结尾最靠左的回文中心,那么每次用i-f[i-p[i]]更新答案就可以了,感觉十分巧妙......

    #include<bits/stdc++.h>
    using namespace std;
    const int N = 200010;
    int n, len, ans, mx, pos;
    int p[N], f[N];
    char s[N], t[N];
    int main()
    {
        scanf("%s", t + 1);
        n = strlen(t + 1);
        s[0] = '!';
        s[len = 1] = '#';
        for(int i = 1; i <= n; ++i) s[++len] = t[i], s[++len] = '#';
        for(int i = 1; i <= len; ++i) 
        {
            if(i < mx) p[i] = min(p[2 * pos - i], mx - i);
            while(s[i - p[i]] == s[i + p[i]])
            {
                if(!f[i + p[i]]) f[i + p[i]] = i;
                ++p[i];
            }   
            if(i + p[i] > mx)
            {
                pos = i;
                mx = i + p[i];
            }
        }
        for(int i = 1; i <= len; ++i) ans = max(ans, i - f[i - p[i]]);
        printf("%d
    ", ans);
        return 0;
    } 
    View Code
  • 相关阅读:
    第十章 泛型程序设计与C++标准模板库 迭代器
    Linux 命令
    Linux 命令
    Linux 命令
    Linux 命令
    Linux 命令
    Linux 命令
    Linux 命令
    Linux 命令
    Linux 命令
  • 原文地址:https://www.cnblogs.com/19992147orz/p/7553182.html
Copyright © 2020-2023  润新知