题解 CF1296E2 【String Coloring (hard version)】
根据逆序对那套理论,要通过相邻数交换使得序列有序,每一组逆序对必须要交换一次。
所以事实上题目的要求就是如果两个下标
如果对这个模型比较熟悉的话,可以发现它和最长下降子序列有关。
在一个下降子序列
因此不同颜色的数量不小于最长下降子序列的长度,下面证明:存在一种染色方案,使得不同颜色的数量等于最长下降子序列的长度。
令
对于任意一组逆序对
于是我们得到了一组最小染色方案。
#include <bits/stdc++.h>
using namespace std;
const int MAXN=200010;
int n,ans,dp[MAXN],mx[27];
char c[MAXN];
int main () {
scanf("%d%s",&n,c+1);
for (int i=n;i>=1;i--) {
dp[i]=mx[c[i]-'a']+1;
for (int j=c[i]-'a'+1;j<=25;j++) {mx[j]=max(mx[j],dp[i]);}
ans=max(ans,dp[i]);
}
printf("%d\n",ans);
for (int i=1;i<n;i++) {printf("%d ",dp[i]);}
printf("%d\n",dp[n]);
return 0;
}