[POJ 2001] Prefijos más cortos (árbol de diccionarios)

Prefijos más cortos

Límite de tiempo: 1000MS Límite de memoria: 30000K

Descripción

Un prefijo de una cadena es una subcadena que comienza al principio de la cadena dada. Los prefijos de "carbono" son: "c", "ca", "coche", "carb", "carbo" y "carbono". Tenga en cuenta que la cadena vacía no se considera un prefijo en este problema, pero cada cadena no vacía se considera un prefijo de sí misma. En el lenguaje cotidiano, tendemos a abreviar las palabras con prefijos. Por ejemplo, "carbohidrato" se abrevia comúnmente por "carbohidrato". En este problema, dado un conjunto de palabras, encontrará para cada palabra el prefijo más corto que identifica de manera única la palabra que representa.

En la entrada de muestra a continuación, “carbohidrato” se puede abreviar como “carboh”, pero no se puede abreviar como “carbo” (o algo más corto) porque hay otras palabras en la lista que comienzan con “carbo”.

Una coincidencia exacta anulará una coincidencia de prefijo. Por ejemplo, el prefijo "coche" coincide exactamente con la palabra "coche" dada. Por tanto, se entiende sin ambigüedad que “coche” es una abreviatura de “coche”, no de “carruaje” o cualquiera de las otras palabras de la lista que comienzan con “coche”.

Entrada

La entrada contiene al menos dos, pero no más de 1000 líneas. Cada línea contiene una palabra que consta de 1 a 20 letras minúsculas.

Salida

La salida contiene el mismo número de líneas que la entrada. Cada línea de la salida contiene la palabra de la línea correspondiente de la entrada, seguida de un espacio en blanco y el prefijo más corto que identifica de manera única (sin ambigüedad) esta palabra.

Entrada de muestra

Carbohidrato de
carro
carburador
caramelo
caribú cartílago
carbónico carro de carbono carton car carbonato





Salida de muestra

carbohidratos carboh
carrito Carrito
carburador carbu
caramelo Cara
caribú Cari
carbónico carboni
cartílago Carti
carbono carbono
carro carr
cartón CARTO
coche coche
carbona carbonato

La idea principal del tema: Déle algunas palabras como su diccionario, y luego encontrará el prefijo de cada palabra que puede identificar de forma única la palabra.
Análisis: agregue una variable V del número de registros a la estructura de árbol del diccionario. Luego, envíe su prefijo hasta que aparezca una palabra como prefijo después de la grabación.

#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "cstdlib"

using namespace std;

const int maxn = 1e3+5;
const int MAX = 26;

char s[maxn][MAX];

struct Trie{
    int v;
    bool exit;
    Trie *next[MAX];
    Trie(){
        v = 0;
        exit = false;
        memset(next,0,sizeof(next));
    }
};

Trie *root = new Trie();

void Insert_Trie( char *str ){
    Trie *p = root;
    for( int i=0 ; i<strlen(str) ; i++ ){
        int num = str[i]-'a';
        if( p->next[num] == NULL ){
            p->next[num] = new Trie();
            p->next[num]->v++;
            p = p->next[num];
        }
        else{
            p->next[num]->v++;
            p = p->next[num];
        }
    }
    p->exit = true;
}

void Qurry_Trie( char *str ){
    Trie *p = root;
    for( int i=0 ; i<strlen(str) ; i++ ){
        printf("%c",str[i]);
        int num = str[i]-'a';
        p = p->next[num];
        if(  p->v==1 ){
            puts("");
            return;
        }
    }
    puts("");
    return;
}

int main(){
    int k = 0;
    while( scanf("%s",s[k]) != EOF ){
        Insert_Trie(s[k++]);
    }
    for( int i=0 ; i<k ; i++ ){
        printf("%s ",s[i]);
        Qurry_Trie(s[i]);
    }
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/thesprit/article/details/52152368
Recomendado
Clasificación