String Coloring (hard version)

E2. String Coloring (hard version)

首先我们要明确一点,最多只会出现26种颜色,因为当下字母s[i]如果在后面s[>i]出现过,那么在 i 这个位置的最佳颜色选择即为先前确定的颜色。所以我们可以使用状态压缩来记录状态。

// Created by CAD on 2020/2/5.
#include <bits/stdc++.h>
using namespace std;

int a[200005];
int x[27];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;cin>>n;
    string s;cin>>s;
    int maxn=0;
    for(int i=n-1;i>=0;--i){
        int flag=0;
        for(int j=s[i]-'a';j>=1;--j)
            flag|=x[j];
        for(int k=0;k<=25;++k)
            if((1<<k)&flag) continue;
            else {
                x[s[i]-'a'+1]|=1<<k;
                a[i]=k;
                maxn=max(maxn,k);
                break;
            }
    }
    cout<<maxn+1<<endl<<a[0]+1;
    for(int i=1;i<n;++i)
        cout<<" "<<a[i]+1;
    cout<<endl;
    return 0;
}
posted @ 2020-02-05 19:16  caoanda  阅读(168)  评论(0编辑  收藏  举报