Submission #84497

#TimeUsernameProblemLanguageResultExecution timeMemory
84497popovicirobertPalindromes (APIO14_palindrome)C++14
23 / 100
384 ms49028 KiB
#include <bits/stdc++.h> #define lsb(x) (x & (-x)) #define ll long long #define ull unsigned long long // 217 // 44 using namespace std; const int MAXN = (int) 3e5; const int B = 57; char str[MAXN + 1]; ull pw[MAXN + 1], hsh[MAXN + 1]; inline ull get_hsh(int l, int r) { return hsh[r] - hsh[l - 1] * pw[r - l + 1]; } int len[2 * MAXN + 5]; inline void manacher(int n) { vector <char> aux(2 * n + 5); int i, sz = 0; for(i = 1; i <= n; i++) { aux[++sz] = '*'; aux[++sz] = str[i]; } aux[++sz] = '*'; int p = 0; for(i = 1; i <= sz; i++) { if(p + len[p] >= i) { len[i] = min(len[2 * p - i], p + len[p] - i); } while(i - len[i] > 0 && i + len[i] <= sz && aux[i - len[i]] == aux[i + len[i]]) { len[i]++; } if(i + len[i] > p + len[p]) { p = i; } } } unordered_map <ull, int> mp; struct Trie { vector <int> sons; ll lvl, sz; }; vector <Trie> v; ll ans = 0; void dfs(int nod) { for(auto it : v[nod].sons) { dfs(it); v[nod].sz += v[it].sz; } ans = max(ans, 1LL * v[nod].lvl * v[nod].sz); } int main() { //ifstream cin("B.in"); //ofstream cout("B.out"); int i; ios::sync_with_stdio(false); cin >> str + 1; int n = strlen(str + 1); manacher(n); pw[0] = 1; for(i = 1; i <= n; i++) { pw[i] = pw[i - 1] * B; hsh[i] = hsh[i - 1] * B + str[i] - 'a' + 1; } int id = 1; v.resize(2); for(i = 2; i <= 2 * n; i++) { int last = 0, j = 0; bool ok = 0; for(j = len[i] / 2; j >= 1; j--) { ull cur = get_hsh(i / 2 - j + 1, i / 2 + j - (1 - i % 2)); int l = 2 * j - (1 - i % 2); ok = 0; if(mp[cur] == 0) { ok = 1; mp[cur] = ++id; Trie aux; aux.lvl = l; aux.sz = 0; v.push_back(aux); } if(last != 0) { v[mp[cur]].sons.push_back(last); } else { v[mp[cur]].sz++; } last = mp[cur]; if(!ok) { break; } } if(ok == 1) { v[1].sons.push_back(last); } } dfs(1); cout << ans; //cin.close(); //cout.close(); return 0; }

Compilation message (stderr)

palindrome.cpp: In function 'int main()':
palindrome.cpp:68:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
     cin >> str + 1;
            ~~~~^~~
#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...