zoukankan      html  css  js  c++  java
  • 洛谷 P3805 【模板】manacher算法

    传送门:https://www.luogu.org/problem/P3805

    思路:一道马拉车算法的裸题,直接输入输出套板子,注意不能在for循环中用strlen(s)测长度,要在for循环外将此值赋值到某个变量中,否则会超时,然后将更新所得的最大值-1就是答案

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int maxlen = 33000030;
    int len = 2;
    int ans = -1;
    int r[maxlen];
    char s[maxlen];
    char ss[maxlen];
    void manacher()
    {
        ss[0] = '~';
        ss[1] = '#';
        int lens = strlen(s);//放到变量外 否则会超时
        for(int i = 0; i < lens; i++)
        {
            ss[len++] = s[i];
            ss[len++] = '#';
        }
        ss[len] = '$';
        int max_r = 1;
        int pos = 1;
        for(int i = 1; i < len; i++)
        {
            if(max_r > i)
                r[i] = min(max_r - i, r[2 * pos - i]);
            else
                r[i] = 1;
            while( ss[i + r[i] ] == ss[i - r[i] ])
                r[i]++;
            if(r[i] + i > max_r)
            {
                max_r = r[i] + i;
                pos = i;
            }
            ans = max(r[i], ans);
        }
    }
    int main()
    {
        scanf("%s", s);
        manacher();
        cout << ans - 1  << endl;
    }
  • 相关阅读:
    Basic knowledge of html (keep for myself)
    科学技术法转成BigDemcial
    SimpleDateFormat
    log4j 配置实例
    R 实例1
    yield curve
    if-else的优化举例
    十二、高级事件处理
    十一、Swing
    十、输入/输出
  • 原文地址:https://www.cnblogs.com/yyaoling/p/12260428.html
Copyright © 2011-2022 走看看