洛谷 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;
}

 

posted @ 2019-07-28 22:37  是妖妖灵鸭  阅读(88)  评论(0编辑  收藏  举报