Pagini recente » Cod sursa (job #1693262) | Cod sursa (job #734328) | Atasamentele paginii poza_derby | Cod sursa (job #636734) | Cod sursa (job #1458523)
#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;
}