Submission #493448

#TimeUsernameProblemLanguageResultExecution timeMemory
493448aanjiPalindromes (APIO14_palindrome)C++17
100 / 100
54 ms63008 KiB
#include <bits/stdc++.h>
using namespace std;

struct pal_tree {
    #define sigma 26
    struct node {
        int len, dep, cnt, slink;
        int to[sigma];
        node(int _len = 0, int _dep = 0, int _cnt = 0, int _slink = 0) {
            len = _len; dep = _dep; cnt = _cnt; slink = _slink;
            for (int i = 0; i < sigma; i++) {
                to[i] = 0;
            }
        }
    };
    int suff; string s;
    vector<node> tree;
    void init() {
        tree.clear(); s = ""; suff = 2;
        tree.push_back(node(0, 0, 0, 0));
        tree.push_back(node(-1, 0, 0, 1));
        tree.push_back(node(0, 0, 0, 1));
    }
    void add_letter(char c) {
        s += c; int len = s.size();
        while (c != s[len - 2 - tree[suff].len]) {
            suff = tree[suff].slink;
        }
        int nxt = tree[suff].to[c - 'a'];
        if (!nxt) {
            nxt = tree.size();
            tree[suff].to[c - 'a'] = nxt;
            tree.push_back(node(tree[suff].len + 2, 0, 0, 0));
            if (suff == 1) {
                tree[nxt].slink = 2;
            }
            else {
                int z = tree[suff].slink;
                while (c != s[len - 2 - tree[z].len]) {
                    z = tree[z].slink;
                }
                tree[nxt].slink = tree[z].to[c - 'a'];
            }
            tree[nxt].dep = tree[tree[nxt].slink].dep + 1;
        }
        tree[nxt].cnt++; suff = nxt;
    }
    void calc_cnt() {
        for (int i = tree.size() - 1; i > 2; i--) {
            tree[tree[i].slink].cnt += tree[i].cnt;
        }
    }
    node &operator[](int i) {
        return tree[i];
    }
} pt;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    string s; cin >> s;
    pt.init();
    for (char i : s) {
        pt.add_letter(i);
    }
    pt.calc_cnt();
    long long res = 0;
    for (int i = pt.tree.size() - 1; i > 2; i--) {
        res = max(res, (long long)(pt.tree[i].len) * pt.tree[i].cnt);
    }
    cout << res << endl;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...