E2. String Coloring (hard version)
题解:
分析可以知道我们肯定是一个字典序大于了一个字母的字典序那么就交换,所以题目就转换成了找序列的有多少个不下降序列。
根据Dilworth’s theorem:
我们知道:
不下降子序列的个数=最长不上升序列的长度。
不上升子序列的个数=最长不下降序列的长度。
所以我们这道题就是查找最长不上升序列的长度。
我们定义dp1[i]是以i下标结尾的最长不上升序列长度的最大值。dp2[i]以i字母结尾的最长不上升序列长度的最大值。
#include <bits/stdc++.h>
//#define int long long
using namespace std;
const int N=2e5+7;
int dp1[N],dp2[30];
int main()
{
int n;
cin>>n;
string a;
cin>>a;
for(int i=0;i<n;i++){
dp1[i]=1;
for(int j=25;j>(a[i]-'a');j--){
dp1[i]=max(dp1[i],dp2[j]+1);
}
dp2[a[i]-'a']=max(dp1[i],dp2[a[i]-'a']);
}
int res=0;
for(int i=0;i<26;i++) res=max(res,dp2[i]);
cout<<res<<endl;
for(int i=0;i<n;i++) printf("%d ",dp1[i]);
puts("");
}