Submission #89871

#TimeUsernameProblemLanguageResultExecution timeMemory
89871Alexa2001Palindromes (APIO14_palindrome)C++17
47 / 100
102 ms79284 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int Nmax = 1e6 + 5; struct tr { int len, sufflink, cnt; map<char, int> go; }; string S; class PalindromicTree { int nodes, suff; tr a[Nmax]; public: void init() { nodes = 2; a[1].len = -1; a[1].sufflink = 1; a[1].cnt = 0; a[2].len = 0; a[2].sufflink = 1; a[2].cnt = 0; suff = 2; } void add(char c, int pos) { int act = a[suff].len, node = suff; while(pos-act-1<0 || S[pos] != S[pos - act - 1]) { node = a[node].sufflink; act = a[node].len; } if(a[node].go[c]) { suff = a[node].go[c]; ++a[suff].cnt; return; } a[node].go[c] = ++nodes; a[nodes].len = a[node].len + 2; a[nodes].cnt = 1; suff = nodes; if(a[nodes].len == 1) { a[nodes].sufflink = 2; return; } node = a[node].sufflink; act = a[node].len; while(pos-act-1<0 || S[pos] != S[pos - act - 1]) { node = a[node].sufflink; act = a[node].len; } a[nodes].sufflink = a[node].go[c]; } int get_result() { int i; ll ans = 0; for(i=nodes; i; --i) a[a[i].sufflink].cnt += a[i].cnt; for(i=3; i<=nodes; ++i) ans = max(ans, (ll) a[i].cnt * a[i].len); return ans; } } paltree; int main() { // freopen("input", "r", stdin); cin.sync_with_stdio(false); paltree.init(); cin >> S; int nr = 0; for(auto letter : S) paltree.add(letter, nr++); cout << paltree.get_result() << '\n'; 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...