Submission #116539

#TimeUsernameProblemLanguageResultExecution timeMemory
116539pbt17Palindromes (APIO14_palindrome)C++14
100 / 100
51 ms37524 KiB
#include <bits/stdc++.h> using namespace std; template<int N_, int A> struct pal_tree { const static int N = N_ + 2; int n, s[N], suff[N]; int k, len[N], occ[N], to[N][A], link[N]; pal_tree() : n(0), k(0) { palindrome(0, 1); palindrome(-1, 1); letter(-1, 0); } int palindrome(int l, int suf) { len[k] = l; occ[k] = 0; fill_n(to[k], A, 0); link[k] = suf; return k++; } int letter(int val, int suf) { s[n] = val; suff[n] = suf; occ[suf]++; return n++; } int trim(int u) { while (s[n - 1 - len[u]] != s[n]) { u = link[u]; } return u; } void put(int c) { s[n] = c; // don't delete :P int u = trim(suff[n - 1]); if (!to[u][c]) { int v = trim(link[u]); to[u][c] = palindrome(len[u] + 2, to[v][c]); } letter(c, to[u][c]); } int distinct() { return k - 2; } void occurrences() { for (int u = k - 1; u > 1; u--) { occ[link[u]] += occ[u]; } } void clear() { n = 1; } }; int main() { pal_tree<300000, 26> t; string s; cin >> s; for (char c : s) t.put(c - 'a'); long long ans = 1; t.occurrences(); for (int i = 2; i < t.k; i++) { ans = max(ans, (long long) t.occ[i] * t.len[i]); } cout << ans << endl; }
#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...