[HDU 1251] Dilema estadístico (Introducción al árbol de diccionarios)

Rompecabezas estadístico

Límite de tiempo: 4000/2000 MS (Java / otros) Límite de memoria: 131070/65535 K (Java / otros)

Descripción del problema

Ignatius encontró recientemente un problema. El maestro le dio muchas palabras (solo letras minúsculas, no aparecerán palabras repetidas), y ahora el maestro quiere que él cuente el número de palabras prefijadas con una determinada cadena (la palabra en sí también es su propio Prefijo ).

Entrada

La primera parte de los datos de entrada es una lista de palabras, una palabra por línea, la longitud de la palabra no supera las 10, representan las palabras que el maestro le dio a Ignacio para que las contara, y una línea en blanco representa el final de la palabra. La segunda parte es una serie de palabras Haga preguntas, una pregunta por línea, y cada pregunta es una cadena.

Nota: Solo hay un conjunto de datos de prueba para esta pregunta, que se procesará hasta el final del archivo.

Salida

Para cada pregunta, indique el número de palabras precedidas por la cadena.

Entrada de muestra


banda de plátano
abeja acm
absoluto

ba
b
banda
abc

Salida de muestra

2
3
1
0

El título es para encontrar la cantidad de palabras que ingresó al principio con la cadena que ingresó como prefijo.
Si no está seguro del árbol del diccionario, consulte:
http://blog.csdn.net/hguisu/article/details/8131559
http://blog.csdn.net/thesprit/article/details/52065241

De acuerdo con el algoritmo del árbol de diccionarios, colocamos las palabras en nuestro árbol de diccionarios. Luego, haga coincidir el prefijo con la cadena ingresada más tarde.

G ++ de Hang Dian a veces excede el límite de memoria del árbol de diccionario dinámico, por lo que todos usan el envío de C ++.
Se recomienda aprender a utilizar un árbol de diccionario estático.

#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "malloc.h"

using namespace std;

const int maxn = 26;

typedef struct Trie{
    int v;
    Trie *next[maxn];
}Trie;

Trie root;

void CreateTrie(char *str){
    int len = strlen(str);
    Trie *p,*q;
    p = &root;
    int num;
    for( int i=0 ; i<len ; i++ ){
        num = str[i]-'a';
        if( p->next[num] == NULL ){
            q = (Trie *)malloc(sizeof(root));
            q->v=1;
            for( int j=0 ; j<maxn ; j++ ){
                q->next[j]=NULL;
            }
            p->next[num] = q;
            p = p->next[num];
        }
        else{
            p->next[num]->v++;
            p = p->next[num];
        }
    }
}

int FindTrie(char *str){
    int len = strlen(str);
    Trie *p = &root;
    for( int i=0 ; i<len ; i++ ){
        int num = str[i]-'a';
        p = p->next[num];
        if( p == NULL ) return 0;
    }
    return p->v;
}


int main(){
    for( int i=0 ; i<maxn ; i++ ){
        root.next[i]=NULL;
    }
    char str1[maxn];
    while( gets(str1) && str1[0]!='\0' ){
        CreateTrie(str1);
    }
    char str2[maxn];
    while( scanf("%s",str2)!=EOF ){
        int ans = FindTrie(str2);
        printf("%d\n",ans);
    }
    return 0;
}

Supongo que te gusta

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