Submission #138874

#TimeUsernameProblemLanguageResultExecution timeMemory
138874alishahali1382Palinilap (COI16_palinilap)C++14
100 / 100
121 ms24384 KiB
#include <bits/stdc++.h> #pragma GCC optimize ("Ofast") #pragma GCC optimize ("unroll-loops") #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") using namespace std; typedef long long ll; typedef long double ld; typedef pair<int, int> pii; typedef pair<pii, int> piii; typedef pair<ll, ll> pll; #define debug(x) cerr<<#x<<'='<<(x)<<endl; #define debugp(x) cerr<<#x<<"= {"<<(x.first)<<", "<<(x.second)<<"}"<<endl; #define debug2(x, y) cerr<<"{"<<#x<<", "<<#y<<"} = {"<<(x)<<", "<<(y)<<"}"<<endl; #define debugv(v) cerr<<#v<<" : ";for (auto x:v) cerr<<x<<' ';cerr<<endl; #define all(x) x.begin(), x.end() #define pb push_back #define kill(x) return cout<<x<<'\n', 0; const ld eps=1e-7; const int inf=1000000010; const ll INF=10000000000000010LL; const int mod = 1000000007; const int MAXN = 100010, B=10007; ll n, m, k, u, v, x, y, t, a, b, ans, pal; char A[MAXN]; ll hl[MAXN], hr[MAXN], tav[MAXN]; ll ps1[MAXN]; ll cnt[MAXN][26]; ll getl(int l, int r){ ll res=(hl[r]-hl[l-1]*tav[r-l+1])%mod; return (res+mod)%mod; } ll getr(int l, int r){ ll res=(hr[l]-hr[r+1]*tav[r-l+1])%mod; return (res+mod)%mod; } bool check(int l1, int r1, int l2, int r2){ if (min(l1, l2)<1 || n<max(r1, r2)) return 0; //debug("shit") return getl(l1, r1)==getr(l2, r2); } int main(){ ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0); //freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); string s; cin>>s; n=s.size(); for (int i=1; i<=n; i++) A[i]=s[i-1]; for (int i=1; i<=n; i++) hl[i]=(hl[i-1]*B+A[i])%mod; for (int i=n; i; i--) hr[i]=(hr[i+1]*B+A[i])%mod; tav[0]=1; for (int i=1; i<=n; i++) tav[i]=tav[i-1]*B%mod; /* // --------------------------------------------------- for (int i=0; i<=n; i++) cerr<<hl[i]<<" \n"[i==n]; debug(check(1, 1, 2, 2)) debug(getl(1, 1)) debug(getl(2, 2)) */ /// even lenth for (int i=1; i<=n; i++){ int dwn=0, up=n+1; while (up-dwn>1){ int mid=(dwn+up)>>1; if (check(i-mid+1, i, i+1, i+mid)) dwn=mid; else up=mid; } int len=dwn, l=i-len+1, r=i+len; //debug2(i, len) if (len){ ps1[l]++; ps1[i+1]--; ps1[i+2]--; ps1[r+2]++; //debug2(l, r) } // tof can be deleted pal+=len; if (l<=1 || r>=n) continue ; dwn=0, up=n; while (up-dwn>1){ int mid=(dwn+up)>>1; if (check(l-1-mid, l-2, r+2, r+1+mid)) dwn=mid; else up=mid; } cnt[l-1][A[r+1]-'a']+=dwn+1; cnt[r+1][A[l-1]-'a']+=dwn+1; } // odd lenth for (int i=1; i<=n; i++){ int dwn=0, up=n+1; while (up-dwn>1){ int mid=(dwn+up)>>1; if (check(i-mid, i-1, i+1, i+mid)) dwn=mid; else up=mid; } int len=dwn, l=i-len, r=i+len; //debug2(i, len) ps1[l]++; ps1[i]-=len+1; ps1[i+1]+=len*2; ps1[i+2]-=len+1; ps1[r+2]++; pal+=len+1; if (l<=1 || r>=n) continue ; dwn=0, up=n; while (up-dwn>1){ int mid=(dwn+up)>>1; if (check(l-1-mid, l-2, r+2, r+1+mid)) dwn=mid; else up=mid; } cnt[l-1][A[r+1]-'a']+=dwn+1; cnt[r+1][A[l-1]-'a']+=dwn+1; } // ---------- for (int i=1; i<=n; i++) ps1[i]+=ps1[i-1]; for (int i=1; i<=n; i++) ps1[i]+=ps1[i-1]; //for (int i=1; i<=n; i++) cerr<<ps1[i]<<" \n"[i==n]; ans=pal; for (int i=1; i<=n; i++) for (int c=0; c<26; c++) ans=max(ans, pal-ps1[i]+cnt[i][c]); cout<<ans<<'\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...