Guía avanzada para la competencia de algoritmos --- Collar 0x18 (notación mínima)

Tema

Inserte la descripción de la imagen aquí

responder

  1. Para dos cadenas idénticas, podemos comparar directamente si las cadenas con el orden lexicográfico más pequeño son iguales. Para encontrar el orden lexicográfico más pequeño, use directamente la notación O (n) más pequeña.
  1. Explicación de notación mínima: -> haga clic aquí

Código

#include <cstring>
#include <iostream>
#include <algorithm>
#include <string.h>

using namespace std;

const int N = 2000000;

int n;
char a[N], b[N];

int get_min(char str[]) {
    
    
    int i = 0, j = 1;
    while (i < n && j < n) {
    
    
        int k = 0;
        while (k < n && str[i + k] == str[j + k]) k++;
        if (k == n) break;
        if (str[i + k] > str[j + k]) i += k + 1;
        else j += k + 1;
        if (i == j) i++;
    }
    int res = min(i, j);
    str[res + n] = 0;
    return res;
}

int main() {
    
    
    scanf("%s%s", a, b);
    n = strlen(a);

    memcpy(a + n, a, n);
    memcpy(b + n, b, n);

    int ia = get_min(a), ib = get_min(b);

    if (strcmp(a + ia, b + ib)) puts("No");
    else {
    
    
        puts("Yes");
        puts(a + ia);
    }

    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_44791484/article/details/113934369
Recomendado
Clasificación