Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
51532 | AK2022071341 | 最优子序列 | C++ | 运行超时 | 30 | 1000 MS | 524388 KB | 1675 | 2022-07-13 11:51:00 |
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=3e3+10; const int MAX_STAGE=1<<12; int n,_,type,Pow[12],lst[12],dp[N][MAX_STAGE],maxn[MAX_STAGE]; char s[N]; vector<int>Max[MAX_STAGE]; vector<int>G[N][MAX_STAGE]; bool vis[N][MAX_STAGE]; string Ans,now; inline void dfs(int x,int y,int pos){ now[pos]=s[x]+'a'; if(pos==0){ if(Ans.empty()||now<Ans)Ans=now; return; } for(int i=0;i<G[x][y].size();i++){ int j=y; if(vis[x][y])j-=Pow[s[x]]; dfs(G[x][y][i],j,pos-1); } } int main(){ scanf("%d%d%d%s",&n,&_,&type,s+1); for(int i=1;i<=n;i++)s[i]-='a'; Pow[0]=1; for(int i=1;i<12;i++)Pow[i]=Pow[i-1]<<1; dp[1][Pow[s[1]]]=1; maxn[Pow[s[1]]]=1; Max[Pow[s[1]]].push_back(1); lst[s[1]]=1; for(int i=2;i<=n;i++){ for(int j=0;j<MAX_STAGE;j++){ if((j&Pow[s[i]])==0)continue; if(dp[lst[s[i]]][j]>maxn[j-Pow[s[i]]]){ dp[i][j]=dp[lst[s[i]]][j]+1; G[i][j].push_back(lst[s[i]]); } else{ dp[i][j]=maxn[j-Pow[s[i]]]+1; for(int k=0;k<Max[j-Pow[s[i]]].size();k++) G[i][j].push_back(Max[j-Pow[s[i]]][k]); vis[i][j]=1; } } for(int j=0;j<MAX_STAGE;j++){ if((j&Pow[s[i]])==0)continue; if(maxn[j]==dp[i][j])Max[j].push_back(i); if(maxn[j]<dp[i][j]){ maxn[j]=dp[i][j]; Max[j].clear(); Max[j].push_back(i); } } lst[s[i]]=i; } int ans=0; for(int i=1;i<=n;i++) for(int j=0;j<MAX_STAGE;j++) ans=max(ans,dp[i][j]); printf("%d\n",ans); if(type){ for(int i=1;i<=n;i++) for(int j=0;j<MAX_STAGE;j++) if(dp[i][j]==ans) dfs(i,j,ans-1); for(int i=0;i<ans;i++)printf("%c",Ans[i]); } return 0; }