Pagini recente » Cod sursa (job #1617291) | Cod sursa (job #1194485) | Cod sursa (job #2334696) | Cod sursa (job #1347880) | Cod sursa (job #2153169)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("trie.in" );
ofstream g("trie.out");
struct t_node {
int counter;
char litera;
t_node* fiu[29];
t_node* parent;
/// Functii nod
t_node* getNext(char c) { return fiu[c-'a']; }
void Init(char a) {
for ( int i=0; i<29; i++ ) fiu[i] = NULL;
parent = NULL;
counter = 0;
litera = a;
}
void Create(char c) {
fiu[c-'a'] = new t_node;
fiu[c-'a']->Init(c);
fiu[c-'a']->parent = this;
}
int countChildren()
{
int result = 0;
for ( int i=0; i<29; i++ )
if ( fiu[i] != NULL )
result++;
return result;
}
};
struct trie {
t_node* root;
trie() {
root = new t_node;
root->Init(-1);
root->litera = -1;
}
void AddEntry(char w[25])
{
t_node* current = root;
for ( int i=0; w[i]; i++ ) {
t_node* next = current->getNext(w[i]);
if ( next == NULL )
current->Create(w[i]);
current = current->getNext(w[i]);
}
current->counter++;
}
void RemoveEntry(char w[25])
{
t_node* current = root;
for ( int i=0; w[i]; i++ ) {
t_node* next = current->getNext(w[i]);
current = current->getNext(w[i]);
}
current->counter--;
while ( current->counter == 0 && current->countChildren() < 1 && current != root ) {
t_node* next = current->parent;
next->fiu[current->litera-'a'] = NULL;
delete current;
current = next;
}
}
int CountWords(char w[25])
{
t_node* current = root;
for ( int i=0; w[i]; i++ ) {
t_node* next = current->getNext(w[i]);
if ( next == NULL )
return 0;
current = current->getNext(w[i]);
}
return current->counter;
}
int LongestPrefix(char w[25])
{
int length = 0;
t_node* current = root;
for ( int i=0; w[i]; i++ ) {
t_node* next = current->getNext(w[i]);
if ( next == NULL ) break;
current = current->getNext(w[i]);
length++;
}
return length;
}
};
int main()
{
int x; char cuvant[25];
trie dictionar;
while ( f >> x >> cuvant ) {
if ( x == 0 ) dictionar.AddEntry(cuvant);
if ( x == 1 ) dictionar.RemoveEntry(cuvant);
if ( x == 2 ) g << dictionar.CountWords(cuvant) << '\n';
if ( x == 3 ) g << dictionar.LongestPrefix(cuvant) << '\n';
}
}