P3649 [APIO2014]回文串

Posted 啦啦啦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P3649 [APIO2014]回文串相关的知识,希望对你有一定的参考价值。

ps:针对 fail 链出的题,一个点的fail指向的节点一定是这个点的子串。

const int N = 300005;

inline void upd(LL &a, LL b) {
    (a < b) && (a = b);
}

struct data {
    int len, fail;
    int ch[26];
};

struct PldTree {
    int res[N];
    int tot, last;

    char s[N];
    data node[N];

    void Inite() {
        mem(res, 0);
        tot = last = 1;
        node[1].len = -1;
        node[0].fail = 1;
    }
    void Insert(int i) {
        while(s[i] != s[i - node[last].len - 1]) last = node[last].fail;
        if (!node[last].ch[s[i] - \'a\']) {
            node[++tot].len = node[last].len + 2;

            int tp = node[last].fail;
            while(s[i] != s[i - node[tp].len - 1]) tp = node[tp].fail;

            node[tot].fail = node[tp].ch[s[i] - \'a\'];
            node[last].ch[s[i] - \'a\'] = tot;
        }
        last = node[last].ch[s[i] - \'a\'];
        res[last]++;
    }
    LL get() {
        LL ans = 0;
        for (int i = tot; i > 1; --i) {
            res[node[i].fail] += res[i];
            upd(ans, 1ll * res[i] * node[i].len);
        }
        return ans;
    }
};

PldTree T;

int main()
{
    T.Inite();
    scanf("%s", T.s + 1);

    int n = strlen(T.s + 1);
    Rep(i, 1, n) T.Insert(i);

    pr(T.get());
    return 0;
}

 

以上是关于P3649 [APIO2014]回文串的主要内容,如果未能解决你的问题,请参考以下文章

P3649 [APIO2014]回文串(回文自动机)

P3649 [APIO2014]回文串(回文树)

P3649 [APIO2014]回文串

Apio2014 回文串

BZOJ3676: [Apio2014]回文串

[BZOJ3676][APIO2014]回文串(Manacher+SAM)