在处理这一题之前,我们需要了解前置Esay题解
前置E1题解
那么E2很简单,找出n段不下降子序列
有一点需要注意
一共有26个字母,因此,最多出现26段不下降子序列
即在E1的基础上加一个for循环即可
code
#include<iostream>
#include<cstdio>
#include<map>
#include<algorithm>
using namespace std;
char p[200010];
char s[200010];
int vis[200010];
int main(){
int len;
cin>>len;
cin>>p+1;
int so = 0,maxn =0;
for(int j = 1;j<=26;j++)
{
int so = 0,sign = 0;
for(int i=1;i<=len;i++)
{
if(p[i]>=so&&!vis[i]){
so = p[i] ;
vis[i] = j;
maxn = j;
sign = 1;
}
}
if(sign==0) break;
}
cout<<maxn<<endl;
for(int i=1;i<=len;i++)
{
cout<<vis[i]<<" ";
}
}