Pagini recente » Cod sursa (job #180623) | Cod sursa (job #1920265) | Cod sursa (job #2208097) | Cod sursa (job #1258872) | Cod sursa (job #2300904)
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
struct Trie
{
struct Trie *fiu[30] = {0};
int terminal = 0, fr = 0;
};
int n;
char cuvant[21];
Trie* T = new Trie;
ifstream f("trie.in");
ofstream g("trie.out");
void adaugare(Trie* T, char* cuvant)
{
if(*cuvant == 0)///Daca am ajuns la sfarsitul cuvantului
{
T->terminal++;
return;
}
if(T->fiu[*cuvant - 'a'] == 0)
{
T->fiu[*cuvant - 'a'] = new Trie;
T->fr++;
}
adaugare(T->fiu[*cuvant - 'a'],cuvant + 1);
}
void stergere(Trie *T, char* cuvant)
{
if(*cuvant == 0)///Daca am ajuns la sfarsitul cuvantului
{
T->terminal--;
}
else
{
stergere(T->fiu[*cuvant - 'a'], cuvant + 1);
if(T->fiu[*cuvant - 'a']->fr == 0 && T->fiu[*cuvant - 'a']->terminal == 0)
{
delete T->fiu[*cuvant - 'a'];
T->fiu[*cuvant - 'a'] = 0;
T->fr--;
}
}
}
void nrAparitii(Trie* T, char* cuvant)
{
if(*cuvant == 0)///Daca am ajuns la sfarsitul cuvantului
{
g<<T->terminal<<'\n';
return;
}
nrAparitii(T->fiu[*cuvant - 'a'],cuvant + 1);
}
int prefixMax(Trie* T, char* cuvant)
{
if(*cuvant == 0 || T->fiu[*cuvant - 'a' ]== 0)///Daca am ajuns la sfarsitul cuvantului
return 0 ;
return 1 + prefixMax(T->fiu[*cuvant - 'a'],cuvant + 1);
}
int main()
{
while(f>>n)
{
f>>cuvant;
if(n == 0) adaugare(T, cuvant);
if(n == 1) stergere(T, cuvant);
if(n == 2) nrAparitii(T, cuvant);
if(n == 3) g<<prefixMax(T, cuvant)<<'\n';
}
return 0;
}