Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
51835 AK2022071340 最优子序列 C++ 解答错误 60 304 MS 114184 KB 2515 2022-07-13 16:28:47

Tests(12/20):


#include <bits/stdc++.h> using namespace std; const int sttl=(1<<12); char c[3005]; int p[3005]; int f[sttl+5][3005][2]; int last[26]; int n,k,type; void pre() { for(int i=1; i<=n; i++) { int num=c[i]-'a'; if(!last[num]) continue; if(last[num]==i) p[i]=0; else p[i]=last[num]; last[num]=i; } } bool ra[sttl+5][3005][2]; vector<pair<int ,int> >q; void get_lst(int k,int st,vector<pair<int ,int> >&q) { if(ra[st][k][0])return; ra[st][k][0]=true; if(f[st][k-1][1]==f[st][k][0]&&!ra[st][k-1][1])//the best solution comes from i-1 { ra[st][k-1][1]=true; q.push_back(make_pair(k-1,st)); } if(f[st][k-1][0]==f[st][k][0]) get_lst(k-1,st,q); } int main() { scanf("%d%d%d",&n,&k,&type); getchar(); for(int i=1; i<=n; i++) { c[i]=getchar(); int num=c[i]-'a'; if(!last[num]) last[num]=i; } pre(); for(int i=1; i<=n; i++) for(int j=0; j<sttl; j++) { int num=c[i]-'a'; f[j][i][0]=max(f[j][i-1][1],f[j][i-1][0]); if((j>>num)&1) f[j][i][1] = max(f[j][p[i]][1],max(f[j^(1<<num)][i-1][0], f[j^(1<<num)][i-1][1])) + 1; } int maxn=0; for(int i=0; i<sttl; i++) maxn=max(maxn,max(f[i][n][0],f[i][n][1])); for(int i=1; i<=n; i++) for(int j=0; j<sttl; j++) if(f[j][i][1]==maxn) { ra[j][i][1]=true; q.push_back(make_pair(i,j)); } string ret=""; for(int k=maxn; k>=1; k--) { char minn='z'; for(int i=0; i<q.size(); i++) minn=min(minn,c[q[i].first]); ret+=minn; vector<pair<int,int> >vec; int num=minn-'a'; for(int i=0; i<q.size(); i++) { int st=q[i].second,k=q[i].first; if(c[k]!=minn) continue; if(f[st][p[k]][1]+1==f[st][k][1]&&!ra[st][p[k]][1])//the best solution come from lst { ra[st][p[k]][1]=true; vec.push_back(make_pair(p[k],st)); } if(f[st^(1<<num)][k-1][1]+1==f[st][k][1]&&!ra[st^(1<<num)][k-1][1])//the best solution comes from i-1 { ra[st][k-1][1]=true; vec.push_back(make_pair(k-1,st^(1<<num))); } if(f[st^(1<<num)][k-1][0]+1==f[st][k][1]) get_lst(k-1,st^(1<<num),vec); } q.swap(vec); } for(int i=0; i<=ret.size()>>1; i++) swap(ret[i],ret[ret.size()-i-1]); printf("%d\n",maxn); if(type) printf("%s\n",ret.c_str()); return 0; }


测评信息: