提交时间:2022-07-13 16:56:50
运行 ID: 51838
#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]; void pre(int n) { 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]; 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); getchar(); for(int i=1; i<=n; i++) { c[i]=getchar(); int num=c[i]-'a'; if(!last[num]) last[num]=i; } pre(n); 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])); vector<pair<int ,int> >q; 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 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); } 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; }