传送门
很显然可以把颜色相同的连续段压起来,然后
O
(
n
)
O(n)
O(n)贪个心。
代码:
#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int N=1e6+5;
char s[N];
int n,sig=0,ct[N],frt=0,bck,ans[N];
int main(){
#ifdef ldxcaicai
freopen("lx.in","r",stdin);
#endif
scanf("%d%s",&n,s+1),bck=n+1;
for(ri i=1;i<=n;++i){
if(s[i]!=s[sig])s[++sig]=s[i],ct[sig]=1;
else ++ct[sig];
}
for(ri pos=0,i=1;i<=sig;++i){
if(s[i]<s[i+1])for(ri j=1,k=pos+ct[i];j<=ct[i];++j,--k)ans[--bck]=k;
else for(ri j=1,k=pos+1;j<=ct[i];++j,++k)ans[++frt]=k;
pos+=ct[i];
}
for(ri i=1;i<=n;++i)cout<<ans[i]<<' ';
return 0;
}