Submission #887481

#TimeUsernameProblemLanguageResultExecution timeMemory
887481phong회문 (APIO14_palindrome)C++17
23 / 100
675 ms131072 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 #define ull unsigned ll const int nmax = 6e5 + 5; const ll oo = 1e18; const int lg = 17; const ll base = 311; const ll mod = 1e9 + 7; #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; int n, cur = 0; string s; ull pw[nmax]; ull rmq[2][nmax][lg + 1]; ll combine(ll a, ll b, int x){ return a * pw[x] + b; } void Init(){ pw[0] = 1; for(int i = 1, j; i <= n; ++i){ pw[i] = pw[i - 1] * base; rmq[0][i][0] = s[i] - 'a' + 1; rmq[1][i][0] = s[n - i + 1] - 'a' + 1; } for(int j = 1; j <= lg; ++j){ for(int i = 1; i + (1 << j) - 1 <= n; ++i){ for(int t = 0; t < 2; ++t){ rmq[t][i][j] = combine(rmq[t][i][j - 1], rmq[t][i + (1 << (j - 1))][j - 1], 1 << (j - 1)); } } } } ull get(int l, int r, int t){ int k = r - l + 1; ull res = 0; for(int j = 0; j <= __lg(k); ++j){ if(k >> j & 1){ res = combine(res, rmq[t][l][j], 1 << j); l += 1 << j; } } return res; } bool check(int l, int r){ return get(l, r, 0) == get(n - r + 1, n - l + 1, 1); } map<ull, bool> mp; map<ull, ull > par, ind; int cnt[nmax]; ll f[nmax]; void update(int l, int r){ int u = l, v = r; bool ok = 1; while(l <= r){ ll x = get(l, r, 0); if(!mp[x]){ 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, 0); } mp[x] = 1; } 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){ ans = max(ans, 1ll * f[i] * cnt[i]); } cout << ans; } /* */

Compilation message (stderr)

palindrome.cpp: In function 'void Init()':
palindrome.cpp:29:20: warning: unused variable 'j' [-Wunused-variable]
   29 |     for(int i = 1, j; i <= n; ++i){
      |                    ^
palindrome.cpp: In function 'void update(int, int)':
palindrome.cpp:64:9: warning: unused variable 'u' [-Wunused-variable]
   64 |     int u = l, v = r;
      |         ^
palindrome.cpp:64:16: warning: unused variable 'v' [-Wunused-variable]
   64 |     int u = l, v = r;
      |                ^
palindrome.cpp: At global scope:
palindrome.cpp:99:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   99 | main(){
      | ^~~~
palindrome.cpp: In function 'int main()':
palindrome.cpp:110:25: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  110 |             int mid = r + l >> 1;
      |                       ~~^~~
palindrome.cpp:120:25: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  120 |             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...