提交时间:2022-07-13 11:51:47

运行 ID: 51541

#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; }