提交时间:2022-07-13 13:29:59
运行 ID: 51714
#include<iostream> #define fst(a,b,c) for(int a=(b);a<=(c);a++) #define pst(a,b,c) for(int a=(b);a>=(c);a--) #define pii pair<int,int> #define mp(x,y) make_pair(x,y) #define fr first #define sc second using namespace std; const int N=3e3+100; int n,K,type,ans; pii rot; int p[N],lst[N],nxt[N][12],f[N][4100]; pii pre[N][4100]; char s[N]; int read(){ char in=getchar(); int x=0; while(!isdigit(in)) in=getchar(); while(isdigit(in)) x=x*10+(in^48),in=getchar(); return x; } int main(){ freopen("seq.in","r",stdin); // freopen("seq.out","w",stdout); n=read(),K=read(),type=read(); scanf("%s",s+1); fst(i,1,n){ p[i]=s[i]-'a'; f[i][1<<p[i]]=1; } fst(i,1,n){ fst(j,0,K-1) nxt[i][j]=lst[j]; lst[p[i]]=i; } pst(i,n,2){ fst(s,0,(1<<K)-1){ if(!f[i][s]) continue; fst(j,0,K-1){ if(!nxt[i][j]||(j!=p[i]&&((s>>j)&1))) continue; if(f[nxt[i][j]][s|(1<<j)]<f[i][s]+1){ f[nxt[i][j]][s|(1<<j)]=f[i][s]+1; pre[nxt[i][j]][s|(1<<j)]=mp(i,s); } else if(f[nxt[i][j]][s|(1<<j)]==f[i][s]+1&&p[pre[nxt[i][j]][s|(1<<j)].fr]>p[i]){ pre[nxt[i][j]][s|(1<<j)]=mp(i,s); } } if(ans<f[i][s]){ ans=f[i][s]; rot=mp(i,s); } else if(p[rot.fr]>p[i]){ rot=mp(i,s); } } } fst(s,0,(1<<K)-1){ if(ans<f[1][s]){ ans=f[1][s]; rot=mp(1,s); } else if(p[rot.fr]>p[1]){ rot=mp(1,s); } } // pst(i,n,1){ // fst(s,0,(1<<K)-1){ // if(!f[i][s]) continue; // printf("f[%d][%d] = %d <- f[%d][%d]\n",i,s,f[i][s],pre[i][s].fr,pre[i][s].sc); // } // } printf("%d\n",ans); if(type){ while(rot.fr){ putchar('a'+p[rot.fr]); rot=pre[rot.fr][rot.sc]; } } return 0; }