提交时间:2022-07-13 13:24:44

运行 ID: 51708

#include<bits/stdc++.h> #define ll long long using namespace std; const int maxn=3e3+5; const int inf=0x3f3f3f3f; int n,k,type,cnt; int mp[256]; char s[maxn]; int col[maxn],val[maxn]; ll f[3][1<<13][14]; pair<short,short> from[maxn][1<<12][13]; ll sum[13][maxn]; int main(){ scanf("%d%d%d",&n,&k,&type); scanf("%s",s+1); for(int i=1;i<=n;i++){ if(!mp[s[i]]){ mp[s[i]]=++cnt; } }k=cnt,cnt=0; for(int i=1;i<256;i++){ if(mp[i]) mp[i]=++cnt; }cnt=0; for(int i=1;i<=n;i++){ int j=i,now=0; while(s[j]==s[i]&&j<=n) j++,now++; col[++cnt]=mp[s[i]];val[cnt]=now; i=j-1; } int u=(1<<k)-1; memset(f,0xc0,sizeof f); f[0][0][0]=0; int cur=0; for(int i=1;i<=cnt;i++){ cur^=1; for(int S=0;S<=u;S++){ for(int j=0;j<=k;j++){ if(j&&!(S&(1<<(j-1)))) continue; f[cur][S][j]=max(f[cur^1][S][j],f[cur][S][j]); if(col[i]==j){ f[cur][S][j]=max(f[cur][S][j],f[cur^1][S][j]+val[i]); }else{ if(S&(1<<(col[i]-1))) continue; f[cur][S^(1<<(col[i]-1))][col[i]]=max(f[cur][S^(1<<(col[i]-1))][col[i]],f[cur^1][S][j]+val[i]); } } } } ll ans=0; int a,b,c; for(int j=1;j<=n;j++){ for(int S=1;S<=u;S++){ if(f[cnt&1][S][j]>ans) ans=f[cnt&1][S][j]; } } printf("%lld",ans); if(!type) return 0; }