Submission #887965

#TimeUsernameProblemLanguageResultExecution timeMemory
887965phongPalindromes (APIO14_palindrome)C++17
100 / 100
626 ms76092 KiB
#pragma GCC optimize("Ofast") #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,fma") #pragma GCC optimize("unroll-loops") #include<bits/stdc++.h> #define ll long long const int nmax = 3e5 + 5; const ll oo = 1e18; const int lg = 18; const int tx = 2; const ll base = 311; #define pii pair<int, int> #define fi first #define se second #define debug(a, n) for(int i = 1; i <= n; ++i) cout << a[i] << ' '; using namespace std; ll mod[] = {(int)1e9 + 7, (int)1e9 + 9}; int n, cur = 0; string s; int pw[2][nmax], h[nmax][2]; int D_odd[nmax]; int D_even[nmax]; void Calc_D_odd() { int L = 1; int R = 0; for(int i = 1 ; i <= n; i++) { if(i > R) D_odd[i] = 0; else D_odd[i] = min(R - i, D_odd[L + (R - i)]); while(i - D_odd[i] - 1 > 0 && i + D_odd[i] + 1 <= n && s[i - D_odd[i] - 1] == s[i + D_odd[i] + 1]) { D_odd[i]++; } if(i + D_odd[i] > R) { R = i + D_odd[i]; L = i - D_odd[i]; } } } void Calc_D_even() { int L = 1; int R = 0; for(int i = 1 ; i < n; i++) { int j = i + 1; if(j > R) D_even[i] = 0; else D_even[i] = min(R - j + 1, D_even[L + (R - j)]); while(i - D_even[i] > 0 && j + D_even[i] <= n && s[i - D_even[i]] == s[j + D_even[i]]) { D_even[i]++; } if(i + D_even[i] > R) { R = i + D_even[i]; L = j - D_even[i]; } } } void Init(){ for(int j = 0; j < tx; ++j) pw[j][0] = 1; for(int i = 1, j; i <= n; ++i){ for(int j = 0; j < tx; ++j){ pw[j][i] = 1ll * pw[j][i - 1] * base % mod[j]; h[i][j] = (1l * h[i - 1][j] * base + s[i] - 'a' + 1) % mod[j]; } } } int get(int l, int r, int ix){ return (h[r][ix] - 1ll * h[l - 1][ix] * pw[ix][r - l + 1] + 1ll * mod[ix] * mod[ix]) % mod[ix]; } map<ll, bool> mp; map<ll, int> ind; int cnt[nmax], f[nmax], b[nmax]; vector<int> adj[nmax]; void update(int l, int r){ bool ok = 1;int sz = 0; while(l <= r){ ll x = 1ll * get(l, r, 0) * (1ll << 32) + get(l, r, 1); if(!mp[x]){ ind[x] = ++cur; b[++sz] = cur; if(ok){ f[cur]++; ok = 0; } cnt[cur] = r - l + 1; mp[x] = 1; } else{ int id = ind[x]; b[++sz] = id; if(ok) f[id]++; break; } ++l, --r; } if(l > r) b[++sz] = 0; for(int i = 1, x, y; i < sz; ++i){ x = b[i], y = b[i + 1]; adj[y].push_back(x); } } void dfs(int u){ for(auto v : adj[u]){ dfs(v); f[u] += f[v]; } } main(){ ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0); // freopen("code.inp", "r", stdin); // freopen("code.out", "w", stdout); cin >> s; n = s.size(); s = ' ' + s + ' '; Init(); Calc_D_odd(); Calc_D_even(); vector<pii> tmp; for(int i = n; i >= 1; --i){ tmp.push_back({i - D_odd[i], i + D_odd[i]}); if(i < n) tmp.push_back({i - D_even[i] + 1, i + D_even[i]}); } sort(tmp.begin(), tmp.end(), [](pii a, pii b){ return a.se - a.fi < b.se - b.fi; }); for(auto [l,r]: tmp) update(l, r); dfs(0); ll ans = 0; for(int i = 1; i <= cur; ++i){ ans = max(ans, 1ll * f[i] * cnt[i]); } cout << ans; } /* */

Compilation message (stderr)

palindrome.cpp: In function 'void Init()':
palindrome.cpp:61:20: warning: unused variable 'j' [-Wunused-variable]
   61 |     for(int i = 1, j; i <= n; ++i){
      |                    ^
palindrome.cpp: At global scope:
palindrome.cpp:114:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  114 | main(){
      | ^~~~
#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...