CodeForces 1296 E2.String colorear (versión dura)

Significado de las preguntas:

Dada una cadena de longitud n
cada personaje ahora para dar una serie de coloración, después de completar la coloración:
Si los personajes no son las posiciones adyacentes mismo color, se pueden intercambiar su posición
ahora quiere a construir una especie de coloración programa, por lo que es posible hacer la última cadena intercambiando el orden lexicográfico más pequeño, y colorear el número mínimo requerido de diferentes colores

ideas:

Lexicográficamente array más pequeño que no es estrictamente creciente (no decreciente)
porque solamente la posición no del mismo color puede ser intercambiada es, se puede encontrar después de la finalización de la coloración, las posiciones relativas de los personajes son del mismo color no cambia vecinos.
Y debido a la necesidad de no estrictamente creciente, debe ser estrictamente mismo color no incremental.
cadena recorrido de izquierda a derecha, por primera a1 carácter, es un color. Para el segundo a2 carácter, si es mayor que o igual a1 a2, es también 1, si a2 es menor que a1, del mismo color que la no debe estrictamente creciente, y no es la misma a1 a2 de color, coloreando 2. Para la tercera a3 carácter, a3 si el máximo, entonces el colorante es 2, el valor máximo del color que el anterior cálculo o caracteres grandes A3, ma asumido, al menos el a3 colorante es ma + 1, color a3 es (ma 1) y (de color igual carácter y a3) un valor máximo.
La otra es que puede abrir una matriz de tamaño 26 para mantener el valor máximo de cada color del carácter, fácil de encontrar.

código:

#include<bits/stdc++.h>
using namespace std;
const int maxm=2e5+5;
char s[maxm];
int ans[maxm];
int d[33];//每种字符的颜色最大值
signed main(){
    int n;
    cin>>n;
    scanf("%s",s+1);
    int cnt=0;
    for(int i=1;i<=n;i++){
        int ma=0;
        for(int j=s[i]-'a'+1;j<26;j++){//前面比他大的字符的最大颜色
            ma=max(ma,d[j]);
        }
        d[s[i]-'a']=max(d[s[i]-'a'],ma+1);//更新最大颜色
        ans[i]=max(d[s[i]-'a'],ma+1);//当前位置颜色
        cnt=max(ans[i],cnt);//更新颜色数量
    }
    cout<<cnt<<endl;
    for(int i=1;i<=n;i++){
        cout<<ans[i]<<' ';
    }
    return 0;
}
Publicados 430 artículos originales · ganado elogios 36 · Vistas a 20000 +

Supongo que te gusta

Origin blog.csdn.net/weixin_44178736/article/details/104561905
Recomendado
Clasificación