[回文自动机优化转移] Central Europe Regional Contest 2014 G. Virus synthesis
2017-10-14 11:10
453 查看
一个可行的方案肯定是把一个回文串前后加上一些字符变成 S
那么只要能DP出每个回文字串的方案就可以了,令这个方案为 f
如果一个回文串长度为奇数,那么它可以由 f去掉两端后的串+2 和 f最长回文后缀+leni−len最长回文后缀 中的最小值转移过来。
如果是偶数,那么它可以由 f去掉两端后的串+1 和 f长度不超过一半的最长回文后缀+leni2−len长度不超过一半的最长回文后缀 中的最小值转移过来
用回文自动机转移就好了
那么只要能DP出每个回文字串的方案就可以了,令这个方案为 f
如果一个回文串长度为奇数,那么它可以由 f去掉两端后的串+2 和 f最长回文后缀+leni−len最长回文后缀 中的最小值转移过来。
如果是偶数,那么它可以由 f去掉两端后的串+1 和 f长度不超过一半的最长回文后缀+leni2−len长度不超过一半的最长回文后缀 中的最小值转移过来
用回文自动机转移就好了
#include <cstdio> #include <iostream> #include <algorithm> using namespace std; const int N=100010; int t,n,p,cnt,a ; int nxt [5],fail ,half ,len ,w ,flah ; inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++; } inline void rea(int &x){ char c=nc(); x=0; for(;c>'9'||c<'0';c=nc());for(;c>='0'&&c<='9';x=x*10+c-'0',c=nc()); } inline int cc(char c){ return c=='A'?0:(c=='C'?1:(c=='G'?2:3)); } inline int rea(int *x){ int c=nc(); int len=0; for(;c>'Z'||c<'A';c=nc());for(;c>='A'&&c<='Z';x[++len]=cc(c),c=nc()); return len; } int ans; inline int extend(int c,int r){ while(a[r-len[p]-1]!=c) p=fail[p]; if(!nxt[p][c]){ int cur=++cnt,k=fail[p]; len[cur]=len[p]+2; while(a[r-len[k]-1]!=c) k=fail[k]; fail[cur]=nxt[k][c]; int t=half[p]; while(a[r-len[t]-1]!=c || len[nxt[t][c]]>(len[cur]>>1)) t=fail[t]; half[cur]=t=nxt[t][c]; if(len[cur]&1) w[cur]=min(w[p]+2,len[cur]-len[fail[cur]]+w[fail[cur]]); else w[cur]=min(w[p]+1,w[t]+(len[cur]>>1)-len[t]+1); nxt[p][c]=cur; } p=nxt[p][c]; return n-len[p]+w[p]; } int main(){ rea(t); while(t--){ n=rea(a); a[0]=-1; ans=1<<30; fail[0]=fail[1]=half[0]=half[1]=1; len[1]=-1; p=0; cnt=1; w[0]=1; w[1]=-1; for(int i=1;i<=n;i++) ans=min(ans,extend(a[i],i)); printf("%d\n",ans); for(int i=0;i<=cnt;i++) for(int j=0;j<4;j++) nxt[i][j]=0; } }
相关文章推荐
- Problem D - Wheels ACM/ICPC Central Europe Regional Contest 2014
- 回文自动机 + DFS --- The 2014 ACM-ICPC Asia Xi’an Regional Contest Problem G.The Problem to Slow Down You
- Problem I - Bricks ACM/ICPC Central Europe Regional Contest 2014
- 回文自动机 + DFS --- The 2014 ACM-ICPC Asia Xi’an Regional Contest Problem G.The Problem to Slow Down You
- Central Europe Regional Contest 2014 B [Gym - 100543B]
- 2014-2015 ACM-ICPC, Central Europe Regional Contest (CERC 14) [Gym-100543G]
- 【codeforces】2014-2015 ACM-ICPC, Central Europe Regional Contest (CERC 14) F Vocabulary【dp】
- Central Europe Regional Contest 2014 [Gym - 100543C]
- Problem C - Sums ACM/ICPC Central Europe Regional Contest 2014
- bzoj4044 [Cerc2014] Virus synthesis(回文自动机 DP)
- LA6575 Odd and Even Zeroes (2013-2014 ACM-ICPC Southwestern Europe Regional Contest F题) 规律
- LA6576 VivoParc (2013-2014 ACM-ICPC Southwestern Europe Regional Contest G题) 搜索
- LA6578 Trending Topic (2013-2014 ACM-ICPC Southwestern Europe Regional Contest I题) 模拟
- 2013-2014 ACM ICPC Central European Regional Contest (CERC 13) K题(dp)
- Central Europe Regional Contest 2016 C.Convex Contour
- 2017-2018 ACM-ICPC, Central Europe Regional Contest (CERC 17)
- Central Europe Regional Contest 2012 Problem C: Chemist’s vows
- 2015-2016 ACM-ICPC, Central Europe Regional Contest (CERC 15) F.Frightful Formula(大数NTT)
- Central Europe Regional Contest 2012 Problem H: Darts
- Bzoj4044:[Cerc2014] Virus synthesis:回文自动机+DP