Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
51541 | AK2022071367 | 最优子序列 | C++ | 运行超时 | 40 | 1000 MS | 860 KB | 1224 | 2022-07-13 11:51:47 |
#include<bits/stdc++.h> using namespace std; const int MAXN=3005,M=12; int f[2][1<<M][M],n,k,op,len,ans; char c[MAXN]; void chkmax(int&a,int b) { if(a<b)a=b; } int s[MAXN]; void dfs(int i,int pos,int jj,int res) { if(res+(n-i+1)<ans+1)return; if(res==ans+1) { for(int i=1; i<=ans; ++i)putchar(s[i]+'a'); exit(0); } if(i>n)return; while(jj!=c[i]-'a')++i; if(jj==c[i]-'a') { s[res]=jj; for(int j=0; j<k; ++j) if(pos&(1<<j)) { dfs(i+1,pos^(1<<jj),j,res+1); if(j==jj) dfs(i+1,pos,jj,res+1); } } dfs(i+1,pos,jj,res); } int main() { scanf("%d%d%d%s",&n,&k,&op,c+1),len=(1<<k)-1; for(int i=n; i; --i) { memset(f[i&1],0,sizeof(f[i&1])); int val=c[i]-'a'; f[i&1][1<<val][val]=1; for(int x=1; x<=len; ++x) { for(int j=0; j<k; ++j) if((x>>j)&1) { chkmax(f[i&1][x][j],f[(i&1)^1][x][j]+(j==val)); } if((x>>val)&1) { int y=x^(1<<val); for(int j=0; j<k; ++j) if((y>>j)&1) chkmax(f[i&1][x][val],f[(i&1)^1][y][j]+1); } } } int pos=0,jj=0; for(int j=0; j<k; ++j) for(int x=1; x<=len; ++x) if(f[1][x][j]>ans) ans=f[1][x][j],pos=x,jj=j; printf("%d\n",ans); if(op)dfs(1,pos,jj,1); return 0; }