提交时间:2022-07-13 12:20:01

运行 ID: 51629

#include<bits/stdc++.h> using namespace std; struct NODE { char word; int num; string S; }; const int N=3001; const int M=13; const int K=(1<<13); int n,k,typ; char s[N]; NODE f[N]; int last[M]; int nxt[N]; int dp[K][M]; string ans[K][M]; int answer; string answer2; int top=0; int main() { freopen("seq.in","r",stdin); freopen("seq.out","w",stdout); scanf("%d%d%d",&n,&k,&typ); scanf("%s",s+1); for(int i=1;i<=n;++i) { if(i==1) { f[++top].word=s[i]; f[top].num++; f[top].S+=s[i]; continue; } if(s[i]==s[i-1]) { f[top].num++; f[top].S+=s[i]; } if(s[i]!=s[i-1]) { f[++top].word=s[i]; f[top].num++; f[top].S+=s[i]; } } int u=(1<<k)-1; for(int i=1;i<=top;++i) { for(int q=u;q>=0;--q) { for(int j=0;j<k;++j) { int c=f[i].word-'a'; if((q|(1<<c))!=q) { if(dp[q][j]+f[i].num>dp[(q|(1<<c))][c]) { dp[(q|(1<<c))][c]=dp[q][j]+f[i].num; ans[(q|(1<<c))][c]=ans[q][j]+f[i].S; } else if(dp[q][j]+f[i].num==dp[(q|(1<<c))][c]) { string r=ans[q][j]+f[i].S; if(r<ans[(q|(1<<c))][c])ans[(q|(1<<c))][c]=ans[q][j]+f[i].S; } } else if(j==c) { dp[q][j]+=f[i].num; ans[q][j]+=f[i].S; } answer=max(answer,dp[(q|(1<<c))][c]); } } } answer2="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"; for(int i=u;i>=0;--i) { for(int j=0;j<k;++j) { if(dp[i][j]==answer)answer2=min(answer2,ans[i][j]); } // cout<<endl; } cout<<answer<<endl; if(typ!=0)cout<<answer2<<endl; }