제출 #418982

#제출 시각아이디문제언어결과실행 시간메모리
418982Dymo회문 (APIO14_palindrome)C++14
73 / 100
1089 ms54256 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long #define ull long long #define ull long long #define pll pair<ll,ll> #define ff first #define ss second #define pb push_back //#define endl "\n" const ll maxn =1e6+5; const ll mod=988642507; const ll mod1=999242501; const ll base=317; const ll base1=293; ull f[maxn]; ull f1[maxn]; ull fv[maxn]; ull fv1[maxn]; ull mu[maxn]; ull mu1[maxn]; ll n; ll cntnw=0; map<pair<ull,ull>,ll> mp; ll cnt[maxn]; ll len[maxn]; ll nxt[maxn]; ll in[maxn]; bool add(pair<ull,ull> val,ll len1) { if (!mp.count(val)) { cntnw++; len[cntnw]=len1; mp[val]=cntnw; return true; } return false; } pair<ull,ull> get(ll l,ll r) { return make_pair((((f[r]-f[l-1]*mu[r-l+1])%mod+mod)%mod),(((f1[r]-f1[l-1]*mu1[r-l+1])%mod1+mod1)%mod1)); } pair<ull,ull> getv(ll l,ll r) { swap(l,r); l=n-l+1; r=n-r+1; return make_pair((((fv[r]-fv[l-1]*mu[r-l+1])%mod+mod)%mod),(((fv1[r]-fv1[l-1]*mu1[r-l+1])%mod1+mod1)%mod1)); } bool chk(ll l,ll r) { ll len=(r-l+1)/2; if(get(r-len+1,r)==getv(l,l+len-1)) return true; return false; } ll val[maxn]; ll val1[maxn]; int main() { ios_base::sync_with_stdio(false); cin.tie(0); if (fopen("test.inp","r")) { freopen("test.inp","r",stdin); freopen("test.out","w",stdout); } mt19937_64 rd(time(NULL)); mu[0]=1; mu1[0]=1; for (int i=1; i<maxn; i++) mu[i]=(mu[i-1]*base)%mod, mu1[i]=(mu1[i-1]*base1)%mod1; for (int i=1; i<=26; i++) { val[i]=abs((ll)rd())%mod; val1[i]=abs((ll)rd())%mod1; } string s; cin>> s; string t=s; n=s.length(); s=" "+ s; for (int i=1; i<=n; i++) { f[i]=(f[i-1]*base+val[s[i]-'a'+1])%mod; f1[i]=(f1[i-1]*base1+val1[s[i]-'a'+1])%mod1; } reverse(t.begin(),t.end()); t=" "+t; for (int i=1; i<=n; i++) { fv[i]=(fv[i-1]*base+val[t[i]-'a'+1])%mod; fv1[i]=(fv1[i-1]*base1+val1[t[i]-'a'+1])%mod1; } ll ans=0; for (ll i=1; i<=n; i++) { ll lenmx=min(i,n-i+1); ll l=1,h=lenmx; while (l<=h) { ll mid=(l+h)/2; if (get(i,i+mid-1)==getv(i-mid+1,i)) l=mid+1; else h=mid-1; } // if (i==2)cout <<get(2,3)<<" "<<getv(1,2)<<" "<<h<<endl; // cout <<i<<" "<<h<<endl; ll pre=-1; for (int j=h;j>=1;j--) { // cout <<j<<endl; auto p=add(get(i,i+j-1),j*2-1); if (j==h) cnt[mp[get(i,i+j-1)]]++; if (pre!=-1) nxt[pre]=mp[get(i,i+j-1)]; ll t=pre; pre=mp[get(i,i+j-1)]; if (t!=-1) in[pre]++; //cout <<mp[get(i,i+j-1)]<<" "<<i<<" "<<i+j-1<<endl; if (!p) break; } } queue<ll> q; for (int i=1;i<=cntnw;i++) { if (!in[i]) q.push(i); } // cout <<q.size()<<"db"<<endl; while (!q.empty()) { auto p=q.front(); q.pop(); if (nxt[p]!=0) { cnt[nxt[p]]+=cnt[p]; in[nxt[p]]--; if (!in[nxt[p]]) q.push(nxt[p]); } ans=max(ans,cnt[p]*len[p]); } for (int i=1;i<=cntnw;i++) in[i]=0, len[i]=0, nxt[i]=0, cnt[i]=0; cntnw=0; mp.clear(); for (ll i=2; i<=n; i++) { ll lenmx=min(i-1,n-i+1); ll l=1,h=lenmx; while (l<=h) { ll mid=(l+h)/2; if (get(i,i+mid-1)==getv(i-mid,i-1)) l=mid+1; else h=mid-1; } ll pre=-1; for (int j=h;j>=1;j--) { auto p=add(get(i,i+j-1),j*2); if (j==h) cnt[mp[get(i,i+j-1)]]++; if (pre!=-1) nxt[pre]=mp[get(i,i+j-1)]; ll t=pre; pre=mp[get(i,i+j-1)]; if (t!=-1) in[pre]++; if (!p) break; } } for (int i=1;i<=cntnw;i++) { if (!in[i]) q.push(i); } while (!q.empty()) { auto p=q.front(); q.pop(); if (nxt[p]!=0) { cnt[nxt[p]]+=cnt[p]; in[nxt[p]]--; if (!in[nxt[p]]) q.push(nxt[p]); } ans=max(ans,cnt[p]*len[p]); } cout <<ans; }

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

palindrome.cpp: In function 'int main()':
palindrome.cpp:71:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   71 |         freopen("test.inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
palindrome.cpp:72:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   72 |         freopen("test.out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#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...