제출 #209820

#제출 시각아이디문제언어결과실행 시간메모리
209820jhnah917회문 (APIO14_palindrome)C++14
73 / 100
1104 ms60972 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll p1 = 179, mod1 = 1e9-63; const ll p2 = 917, mod2 = 1e9+7; int n; char s[606060]; int dp[606060]; ll ha1[606060], pw1[606060]; ll ha2[606060], pw2[606060]; int pv = 0; map<pair<ll, ll>, int> mp; int cnt[303030]; int len[303030]; int lnk[303030]; vector<int> g[303030]; void manacher(){ for(int i=n-1; i>=0; i--){ s[i << 1 | 1] = s[i]; s[i << 1] = '#'; } n <<= 1; s[n++] = '#'; int r = -1, p = -1; for(int i=0; i<n; i++){ dp[i] = (i <= r ? min(dp[p*2-i], r-i) : 0); while(i-dp[i]-1 >= 0 && i+dp[i]+1 < n && s[i-dp[i]-1] == s[i+dp[i]+1]) dp[i]++; if(i+dp[i] > r) r = i+dp[i], p = i; } } pair<ll, ll> substr(int l, int r){ ll r1 = ha1[l] - ha1[r+1] * pw1[r-l+1]; r1 %= mod1; if(r1 < 0) r1 += mod1; ll r2 = ha2[l] - ha2[r+1] * pw2[r-l+1]; r2 %= mod2; if(r2 < 0) r2 += mod2; return {r1, r2}; } void go(int s, int e, pair<ll, ll> now){ if(e-s+1 <= 2) return; auto par = substr(s+1, e-1); int v = mp[now], u; if(!mp.count(par)){ u = mp[par] = ++pv; len[u] = e-s-1; }else u = mp[par]; if(lnk[v]) return; lnk[v] = 1; g[u].push_back(v); go(s+1, e-1, par); } int sz[303030]; int chk[303030]; void dfs(int v){ sz[v] = cnt[v]; chk[v] = 1; for(auto i : g[v]){ if(chk[i]) continue; dfs(i); sz[v] += sz[i]; } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> s; n = strlen(s); pw1[0] = 1, pw1[1] = p1; pw2[0] = 1, pw2[1] = p2; for(int i=n-1; i>=0; i--) ha1[i] = (ha1[i+1] * p1 + s[i]) % mod1; for(int i=2; i<=n; i++) pw1[i] = pw1[i-1] * p1 % mod1; for(int i=n-1; i>=0; i--) ha2[i] = (ha2[i+1] * p2 + s[i]) % mod2; for(int i=2; i<=n; i++) pw2[i] = pw2[i-1] * p2 % mod2; manacher(); for(int i=0; i<n; i++){ if(!dp[i]) continue; int s, e; if(i & 1) s = i/2-dp[i]/2, e = i/2+dp[i]/2; else{ s = i-1, e = i+1; s /= 2, e /= 2; s -= dp[i]/2-1; e += dp[i]/2-1; } auto now = substr(s, e); if(!mp.count(now)){ mp[now] = ++pv; len[mp[now]] = e-s+1; } cnt[mp[now]]++; go(s, e, now); } ll ans = 0; for(int i=1; i<=pv; i++) if(!sz[i]) dfs(i); for(int i=1; i<=pv; i++){ ans = max(ans, (ll)len[i] * sz[i]); } cout << ans; }; // banana

컴파일 시 표준 에러 (stderr) 메시지

palindrome.cpp: In function 'void go(int, int, std::pair<long long int, long long int>)':
palindrome.cpp:47:5: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
     if(lnk[v]) return; lnk[v] = 1;
     ^~
palindrome.cpp:47:24: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
     if(lnk[v]) return; lnk[v] = 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...