CodeForces-1296E2 String Coloring (versión difícil) Pensamiento + Simulación

CodeForces - 1296E2 String Coloring (versión difícil)

Dirección del título original:

http://codeforces.com/problemset/problem/1296/E2

Tema: le da una cadena, puede teñir cada carácter de la cadena, y los caracteres adyacentes de diferentes colores pueden intercambiarse entre sí; independientemente del número de intercambios, solicite el uso mínimo que puede hacer que la cadena esté en orden lexicográfico El número de colores y el método de teñido correspondiente.

Idea básica: se puede encontrar que debido a que los caracteres de diferentes colores pueden intercambiarse a voluntad, siempre que los caracteres del mismo color estén en orden lexicográfico y no estrictamente ascendentes .
En la implementación, siempre que atraviese la cadena una vez, use una matriz de notas para almacenar el carácter lexicográfico más grande de cada color usado. Para cada nuevo personaje atravesado, primero determinamos si el carácter es mayor que cualquiera de los colores usados. El carácter más grande, si lo hay, complete el color y actualice la nota; de lo contrario, agregue un color y actualice la nota.

Código de implementación:

#include <bits/stdc++.h>
using namespace std;
#define IO std::ios::sync_with_stdio(false)
#define int long long
#define INF 0x3f3f3f3f

const int maxn = 2e5 + 10;
int n;
string str;
int ans[maxn];
map<int,int> memo;
signed main() {
    IO;
    cin >> n;
    cin >> str;
    fill(ans, ans + n, -1);//储存答案;
    int num = 1;//当前使用的颜色数目;
    ans[0] = 1;
    memo[1] = str[0] - 'a';//先染色第一个字符;
    for (int i = 1; i < str.size(); i++) {
        int temp = str[i] - 'a';
        bool v = false;
        for (int j = 1; j <= num; j++) {//判断能否用之前的颜色染色该字符;
            if (temp >= memo[j]) {
                memo[j] = temp;
                ans[i] = j;
                v = true;
                break;
            }
        }
        if (!v) {//新增颜色并染色该字符;
            memo[++num] = temp;
            ans[i] = num;
        }
    }
    cout << num << endl;
    for (int i = 0; i < n; i++) cout << ans[i] << " ";
    cout << endl;
    return 0;
}
Publicado 23 artículos originales · ganó 7 · visitado 1756

Supongo que te gusta

Origin blog.csdn.net/weixin_44164153/article/details/104357725
Recomendado
Clasificación