Cod sursa(job #1458523)

Utilizator petru.cehanCehan Petru petru.cehan Data 7 iulie 2015 18:23:48
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 3.04 kb
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

ifstream fin ("trie.in") ;
ofstream fout ("trie.out") ;

struct Trie
{
    int prefixes_count ; // numarul de cuvinte ce au ca prefix stringul curent ( din varful arborelui pana la acel nod )
    int words_count ; //  numarul de cuvinte care se potrivesc exact cu stringul dat
    Trie * child [26] ; // fiecare nod are un numar de copii egal cu dimensiunea alfabetului folosit
} ;

Trie * head ;

void Initialize ()
{
    head = new Trie () ;
    head->prefixes_count = 0 ;
    head->words_count = 0 ;
    for ( unsigned int i = 0 ; i < 27 ; ++ i )
           head -> child [i] = NULL ;
}

void Insert ( string word , Trie * current ) // current la apel va fi defapt head ;
{

    int letter ; // aici calculez pozitia fiecarei litere in alfabet ;

    for ( unsigned int i = 0 ; i < word.length() ; ++ i )
       {
           ++ current->prefixes_count ;
           letter = (int) word[i] - 97 ;
           if ( current->child [ letter ] == 0 )
                      current -> child [ letter ] = new Trie () ;
           current = current -> child [ letter ] ;
       }
    ++ current -> words_count ;
}

bool Delete ( string word , Trie * current )
{
    if ( word.empty() == true )
        -- current -> words_count ;

    else
    {
          int letter = *word.begin() - 97 ;
          word.erase ( word.begin () ) ;

          if ( Delete ( word , current -> child [ letter ] ) == true )
               {
                    current -> child [ letter ] = 0;
                    -- current -> prefixes_count ;
               }
    }

    if ( current -> words_count == 0 && current -> prefixes_count == 0 && current != head )
        {
            delete current ;
            return true ;
        }
    return false ;

}

int GetNumberOfWords ( string word , Trie * current )
{
    int letter ;
    for ( unsigned int i = 0 ; i < word.size() ; ++ i )
       {
           letter = int ( word[i] ) - 97 ;
           if ( current -> child [ letter ] == 0 )
                    return 0 ;
           current = current -> child [ letter ] ;
       }
    return current -> words_count ;
}

int GetNumberOfPrefixes ( string word , Trie * current )
{
    int letter ;
    for ( unsigned int i = 0 ; i < word.size() ; ++ i )
       {
           letter = int ( word[i] ) - 97 ;
           if ( current -> child [ letter ] == 0 )
                    return i ;
           current = current -> child [ letter ] ;
       }
    return current -> prefixes_count ;
}

int main()
{
    int op ;
    string str ;

    Initialize () ;

    while ( fin >> op >> str )
    {
        if ( op == 0 )
            Insert ( str , head ) ;

        if ( op == 1 )
            Delete ( str , head ) ;

        if ( op == 2 )
            fout << GetNumberOfWords ( str , head ) << '\n';

        if ( op == 3 )
            fout << GetNumberOfPrefixes ( str , head ) << '\n';
    }

    fin.close();
    fout.close();

    return 0;
}