Submission #887086

#TimeUsernameProblemLanguageResultExecution timeMemory
887086phongPalindromes (APIO14_palindrome)C++17
47 / 100
1033 ms100704 KiB
#include<bits/stdc++.h> #define ll long long #define int long long const int nmax = 3e5 + 5; const ll oo = 1e18; const int lg = 20; const int base = 4000; const ll mod = 1e9 + 7; #define pii pair<int, int> #define fi first #define se second #define int long long #define debug(a, n) for(int i = 1; i <= n; ++i) cout << a[i] << ' '; using namespace std; int n, cur = 0; string s; int pw[nmax], h[nmax], rh[nmax]; void Init(){ pw[0] = 1; for(int i = 1; i <= n; ++i){ pw[i] = pw[i - 1] * base % mod; h[i] = (h[i - 1] * base + s[i] - 'a' + 1) % mod; } reverse(s.begin(), s.end()); for(int i = 1; i <= n; ++i) rh[i] = (rh[i - 1] * base + s[i] - 'a' + 1) % mod; reverse(s.begin(), s.end()); } int get(int l, int r, int h[]){ return (h[r] - h[l - 1] * pw[r - l + 1] + mod * mod) % mod; } bool check(int l, int r){ return get(l, r, h) == get(n - r + 1, n - l + 1, rh); } map<int, int> mp, f, par, ind; int cnt[nmax]; void update(int l, int r){ int u = l, v = r; bool ok = 1; while(l <= r){ int x = get(l, r, h); if(++mp[x] == 1){ ind[x] = ++cur; if(ok){ f[cur]++; ok = 0; } cnt[cur] = r - l + 1; if(l + 1 <= r - 1){ par[x] = get(l + 1, r - 1, h); } } else{ if(ok){ int id = ind[x]; f[id]++; } break; } ++l, --r; } } vector<int> adj[nmax]; 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(); for(int i = 1; i <= n; ++i){ int l = 1, r = min(i, n - i + 1), kq = 1; while(l <= r){ int mid = r + l >> 1; if(check(i - mid + 1, i + mid - 1)){ kq = mid; l = mid + 1; } else r = mid - 1; } update(i - kq + 1, i + kq - 1); l = 1, r = min(i, n - i), kq = -1; while(l <= r){ int mid = r + l >> 1; if(check(i - mid + 1, i + mid)){ kq = mid; l = mid + 1; } else r = mid - 1; } if(kq != -1) update(i - kq + 1, i + kq); } for(auto [x, y] : mp){ int v = ind[x]; int u = ind[par[x]]; adj[u].push_back(v); } dfs(0); ll ans = 0; for(int i = 1; i <= cur; ++i){ // cout << f[i] ans = max(ans, f[i] * cnt[i]); } cout << ans; } /* */

Compilation message (stderr)

palindrome.cpp: In function 'void update(long long int, long long int)':
palindrome.cpp:45:9: warning: unused variable 'u' [-Wunused-variable]
   45 |     int u = l, v = r;
      |         ^
palindrome.cpp:45:16: warning: unused variable 'v' [-Wunused-variable]
   45 |     int u = l, v = r;
      |                ^
palindrome.cpp: At global scope:
palindrome.cpp:77:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   77 | main(){
      | ^~~~
palindrome.cpp: In function 'int main()':
palindrome.cpp:88:25: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   88 |             int mid = r + l >> 1;
      |                       ~~^~~
palindrome.cpp:98:25: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   98 |             int mid = r + l >> 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...