一直TLE第一个点求助

P4762 [CERC2014] Virus synthesis

找到问题了。。。在下面代码的39行,典中典只删除修改过的数据以保证其严格线性 再加个关闭流同步优化一下子飙到总时长1s了,难绷 想着帮助以后的人就没删贴了 ``` #include<bits/stdc++.h> using namespace std; const int MAXN=1e5+5; int n,last,vcnt,ans; int s[MAXN],pam[MAXN][4],fail[MAXN],len[MAXN],f[MAXN],nxt[MAXN]; inline int getfail(int x,int cur){ while(x!=1 && (cur-len[x]-1<0 || s[cur]!=s[cur-len[x]-1])) x=fail[x]; return x; } inline void add(int ch,int ind){ int fa=getfail(last,ind); if(!pam[fa][ch]){ vcnt++; len[vcnt]=len[fa]+2; int fafail=getfail(fail[fa],ind); fail[vcnt]=pam[fafail][ch]; pam[fa][ch]=vcnt; if(len[vcnt]<=2) nxt[vcnt]=fail[vcnt]; else{ int cur=nxt[fa]; while(ind-len[cur]-1<0 || s[ind-len[cur]-1]!=s[ind] || (len[cur]+2)*2>len[vcnt]) cur=fail[cur];//len[cur]+2 > len[vcnt]/2 nxt[vcnt]=pam[cur][ch]; } } last=pam[fa][ch]; } int main(){ ios::sync_with_stdio(false); cin.tie(0); int t; string str; cin>>t; while(t--){ cin>>str; n=str.size(); // memset(pam,0,sizeof(pam)); // memset(fail,0,sizeof(fail)); for(int i=0;i<=vcnt;i++) memset(pam[i],0,sizeof(pam[i])); fail[0]=1;fail[1]=1; len[0]=0;len[1]=-1; last=0; ans=n; vcnt=1; for(int i=0;i<n;i++){ if(str[i]=='A') s[i]=0; else if(str[i]=='T') s[i]=1; else if(str[i]=='C') s[i]=2; else if(str[i]=='G') s[i]=3; add(s[i],i); } for(int i=2;i<=vcnt;i++) f[i]=len[i]; queue<int>q; f[0]=1;q.push(0); while(!q.empty()){ int cur=q.front();q.pop(); for(int i=0;i<4;i++){ if(!pam[cur][i]) continue; int v=pam[cur][i]; f[v]=min(f[v],f[cur]+1); f[v]=min(f[v],f[nxt[v]]+(len[v]/2-len[nxt[v]])+1); ans=min(ans,f[v]+(n-len[v])); q.push(v); } } cout<<ans<<endl; } return 0; } ```
by MessageBoxA @ 2024-04-16 20:43:12


|