Submission #307749

#TimeUsernameProblemLanguageResultExecution timeMemory
307749richyrichPalindromes (APIO14_palindrome)C++17
73 / 100
1089 ms12444 KiB
//#include "shoes.h" #include<bits/stdc++.h> using namespace std; using ll = long long; const int N = 1e5+10; int tree[N][26], idx, len[N], link[N], t, n, occ[N]; string k; char s[N]; void init() { len[1] = -1, len[2] = 0; link[1] = 1, link[2] = 1; idx = t = 2; } void extend(int p) { while(s[p - len[t] - 1] != s[p]) t = link[t]; //WoW int x = link[t], c = s[p]-'a'; if(!tree[t][c]) { while(s[p - len[x] - 1] != s[p]) x = link[x]; tree[t][c] = ++idx; len[idx] = len[t] + 2; link[idx] = len[idx] == 1 ? 2 : tree[x][c]; } t = tree[t][c]; //printf("%d %d\n", p, t); occ[t]++; } int main() { cin >> k; init(); n = k.size(); for(int i = 0; i < n; i++) s[i+1] = k[i]; for(int i = 1; i <= n; i++) extend(i); for(int i = idx; i > 2; i--) { occ[link[i]] += occ[i]; } ll ans = 0; for(int i = 2; i <= idx; i++) { ans = max(ans, (ll)len[i] * occ[i]); } printf("%lld\n", ans); }
#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...