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;
}