【HDU 1247】 Hat's Words (arbre du dictionnaire)

Paroles du chapeau

Limite de temps: 2000/1000 MS (Java / autres) Limite de mémoire: 65536/32768 K (Java / autres)

Description du problème

Le mot d'un chapeau est un mot du dictionnaire qui est la concaténation d'exactement deux autres mots du dictionnaire.
Vous devez trouver tous les mots du chapeau dans un dictionnaire.

Contribution

L'entrée standard se compose d'un certain nombre de mots minuscules, un par ligne, par ordre alphabétique. Il n'y aura pas plus de 50 000 mots.
Un seul cas.

Production

Votre sortie doit contenir tous les mots du chapeau, un par ligne, par ordre alphabétique.

Exemple d'entrée

un
ahat
chapeau
hatword
hziee
mot

Exemple de sortie

ahat
hatword

L'idée principale du sujet: parmi les mots que vous saisissez, trouvez les mots qui sont épissés par des mots existants. Par exemple, si vous avez un et un chapeau, vous devez afficher ahat. Puisque les échantillons de test sont dans l'ordre lexicographique, nous réduisons la complexité et n'avons pas besoin de les trier.

Introduction à l'arbre du dictionnaire:
http://blog.csdn.net/hguisu/article/details/8131559 http://blog.csdn.net/thesprit/article/details/52065241

Nous créons une arborescence de dictionnaires. Mettez-y tous les mots saisis. Ensuite, commencez à faire ceci: trouvez un mot complet, trouvez le mot précédé de ce mot, retournez vrai, sinon tous retournent faux.

Afin de faciliter le fonctionnement des sous-chaînes, il est recommandé d'utiliser string et sa fonction substr ().

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

using namespace std;

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

string s[maxn];

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

Trie *root = new Trie();

void CreateTrie( string str ){
    Trie *p = root;
    for( int i=0 ; i<str.size() ; i++ ){
        int num = str[i]-'a';
        if( p->next[num] == NULL ) p->next[num] = new Trie();
        p = p->next[num];
    }
    p->exit = true;
}

bool FindTrie( string str ){
    Trie *p = root;
    for( int i=0 ; i<str.size() ; i++ ){
        int num = str[i]-'a';
        if(p->next[num] == NULL) return false;
        p = p->next[num];
    }
    return p->exit;
}

bool FindCombination( string str ){
    Trie *p = root;
    for( int i=0 ; i<str.size() ; i++ ){
        int num = str[i]-'a';
        if(p->next[num] == NULL) return false;
        p = p->next[num];
        if(p->exit && FindTrie(str.substr(i+1))) return true;
    }
    return false;
}

int main(){
    string str;
    int k=0;
    while(cin>>str){
        s[k++] = str;
        CreateTrie(str);
    }
    for( int i=0 ; i<k ; i++ ){
        if(FindCombination(s[i])) cout<<s[i]<<endl;
    }
    return 0;
}

Je suppose que tu aimes

Origine blog.csdn.net/thesprit/article/details/52083889
conseillé
Classement