Pagini recente » Cod sursa (job #892386) | Cod sursa (job #1417031) | Cod sursa (job #1388824) | Cod sursa (job #1411166) | Cod sursa (job #2091549)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct trie
{
int cnt;
trie *fiu[27];
trie() ///constructorul structurii. Se va apela de fiecare data cand cream un nod de tipul trie
{
cnt = 0;
memset(fiu, 0, sizeof(fiu));
}
};
void add_word(trie *nod, char *s)
{
if(*s==NULL) ///Daca am ajuns la finalul cuvantului
{
nod->cnt++;
return;
}
int delta = *s - 'a'; ///Aflam care e urmatorul nod in care vom merge
if(nod->fiu[delta] == NULL)
{
nod->fiu[delta] = new trie();
// node->nrs++;
}
add_word(nod->fiu[delta], s+1);
}
int find_word(trie *nod, char *s)
{
if(*s==NULL)
return nod->cnt;
int delta = *s - 'a';
if(nod->fiu[delta]==NULL)
return 0;
find_word(nod->fiu[delta], s+1);
}
void delete_word(trie *nod, char *s)
{
if(*s==NULL)
{
nod->cnt--;
return;
}
int delta = *s - 'a';
if(nod->fiu[delta] == NULL)
return;
delete_word(nod->fiu[delta], s+1);
}
int find_longest_prefix(trie *nod, char *s)
{
if(*s == NULL)
return 0;
int delta = *s - 'a';
if(nod->fiu[delta] == NULL)
return 0;
return 1 + find_longest_prefix(nod->fiu[delta], s+1);
}
trie *root = new trie();
int main()
{
int operationType;
char cuvant[25];
while(f >> operationType >> cuvant)
{
switch(operationType)
{
case 0:
add_word(root, cuvant);
break;
case 1:
delete_word(root, cuvant);
break;
case 2:
g << find_word(root, cuvant) << "\n";
break;
case 3:
g << find_longest_prefix(root, cuvant) << "\n";
break;
}
}
return 0;
}