Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
51842 | AK2022071340 | 最优子序列 | C++ | 通过 | 100 | 333 MS | 96764 KB | 2248 | 2022-07-13 17:11:11 |
#include <bits/stdc++.h> using namespace std; const int sttl=(1<<12); string c; int p[3005]; int f[sttl+5][3005][2]; int last[26]; bool ra[sttl+5][3005][2]; void get_lst(int k,int st,vector<pair<int ,int> >&vec) { 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; vec.push_back(make_pair(k+1,st)); } if(f[st][k+1][0]==f[st][k][0]) get_lst(k+1,st,vec); } int main() { int n,k,type; scanf("%d%d%d",&n,&k,&type); cin>>c; memset(f,0xc0,sizeof(f)); f[0][n][0]=0; for(int i=0; i<=12; i++) last[i]=n; for(int i=n-1; i>=0; i--) { int num=c[i]-'a'; p[i]=last[num],last[num]=i; for(int j=0; j<sttl; j++) { 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][0][0],f[i][0][1])); vector<pair<int ,int> >q; for(int i=n-1; i>=0; 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 j=maxn; j>=1; j--) { char minn='z'; for (const pair<int,int> &it: q) minn = min(minn, c[it.first]); ret+=minn; vector<pair<int,int> >vec; int num=minn-'a'; for (const pair<int,int> &it: q) { int st=it.second,k=it.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^(1<<num)][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); } printf("%d\n",maxn); if(type) printf("%s\n",ret.c_str()); return 0; }