https://codeforces.com/problemset/problem/1296/E2
cf div3 E2怎么水成这样了。。。以前很多时候都是E2比F难
很自然的想法,后面出线的小的字母,要跟之前所有出线过的比它大的字母交换,那么也就是要跟他们颜色都不一样。那么我们用来记录每个字母当前颜色最大是多少now[c],然后当前位置的颜色的编号必须比他之前出线过的更大的字母的颜色数中最大的+1.
#include<bits/stdc++.h>
using namespace std;
const int maxl=2e5+10;
int n,cnt;
int now[26],ans[maxl];
char s[maxl];
inline void prework()
{
scanf("%d",&n);
scanf("%s",s+1);
}
inline void mainwork()
{
for(int i=1;i<=n;i++)
{
int mx=0,c=s[i]-'a';
for(int j=c+1;j<26;j++)
mx=max(now[j],mx);
ans[i]=mx+1;cnt=max(ans[i],cnt);
now[c]=max(now[c],ans[i]);
}
}
inline void print()
{
printf("%d\n",cnt);
for(int i=1;i<=n;i++)
printf("%d%c",ans[i],(i==n)?'\n':' ');
}
int main()
{
prework();
mainwork();
print();
return 0;
}