Submission #237080

#TimeUsernameProblemLanguageResultExecution timeMemory
237080nvmdavaPalindromes (APIO14_palindrome)C++17
0 / 100
193 ms131076 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define ff first #define ss second mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); #define N 1000005 const ll MOD = 1000000007; const int INF = 0x3f3f3f3f; ll mx = 1; struct Node{ Node *c[30], *p[30]; int sz = 0, de; int trav(){ for(int i = 0; i < 26; ++i){ if(!c[i]) continue; sz += c[i] -> trav(); } mx = max(mx, 1LL * de * sz); return sz; } Node* go(int a){ if(c[a]) return c[a]; c[a] = new Node(); c[a] -> de = de + 2; c[a] -> p[0] = this; for(int i = 1; ; ++i){ c[a] -> p[i] = c[a] -> p[i - 1] -> p[i - 1]; if(!c[a] -> p[i]) break; } return c[a]; } } *r1 = new Node(), *r2 = new Node(); int d1[N], d2[N]; Node *w1[N], *w2[N]; int a[N]; int lg[N]; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); string s; cin>>s; for(int i = 2; i < N; i <<= 1) lg[i] = lg[i >> 1] + 1; r1 -> de = -1; r2 -> de = 0; int n = s.size(); for(int i = 0; i < n; ++i) a[i] = s[i] - 'a'; int lo = -1, r = -1; for(int i = 0; i < n; ++i){ if(r < i){ d1[i] = 1; w1[i] = r1 -> go(a[i]); } else { w1[i] = w1[lo - (i - lo)]; d1[i] = d1[lo - (i - lo)]; int w = max(0, d1[i] - (r - lo)); d1[i] -= w; while(w){ w1[i] = w1[i] -> p[lg[w & -w]]; w -= w & -w; } } while(i + d1[i] < n && i - d1[i] >= 0 && a[i - d1[i]] == a[i + d1[i]]){ w1[i] = w1[i] -> go(a[i + d1[i]]); ++d1[i]; } ++w1[i] -> sz; if(r <= i + d1[i] - 1){ r = i + d1[i] - 1; lo = i; } } r1 -> trav(); lo = -1, r = -1; for(int i = 0; i < n; ++i){ if(r < i){ d2[i] = 0; w2[i] = r2; } else { w2[i] = w2[lo - (i - lo) - 1]; d2[i] = d2[lo - (i - lo) - 1]; int w = max(0, d2[i] - (r - lo)); d2[i] -= w; while(w){ w2[i] = w2[i] -> p[lg[w & -w]]; w -= w & -w; } } while(i + d2[i] < n && i - d2[i] - 1 >= 0 && a[i - d2[i] - 1] == a[i + d2[i]]){ w2[i] = w2[i] -> go(a[i + d2[i]]); ++d2[i]; } ++w2[i] -> sz; if(r <= i + d2[i] - 1){ r = i + d2[i] - 1; lo = i; } } r2 -> trav(); cout<<mx; }
#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...