Pagini recente » Cod sursa (job #3192970) | Cod sursa (job #517313) | Cod sursa (job #1148496) | Cod sursa (job #821077) | Cod sursa (job #1579308)
#include <fstream>
#include <cstring>
#define Sigma 26
using namespace std;
ofstream fout("trie.out");
ifstream fin("trie.in");
char sir[Sigma];
int contor;
struct Trie
{
Trie():fii(0),nr_cuv(0)
{
memset(Fiu, 0, sizeof(Fiu));
}
int fii, nr_cuv;
Trie *Fiu[Sigma];
} *T = new Trie;
void Inserare(Trie *nod, char *s)
{
if (*s=='\0')
{
nod->nr_cuv++;
return;
}
if (!nod->Fiu[*s-'a'])
{
nod->Fiu[*s-'a']=new Trie;
++nod->fii;
}
Inserare(nod->Fiu[*s-'a'],s+1);
}
bool Sterge(Trie *nod, char *s)
{
if ( *s == '\0' )
nod->nr_cuv--;
else
if (Sterge(nod->Fiu[*s-'a'],s+1))
{
nod->Fiu[*s-'a']=0;
nod->fii--;
}
if (nod->nr_cuv==0 && nod->fii==0 && nod!=T )
{
delete nod;
return true;
}
return false;
}
int Count(Trie *nod, char *s)
{
if (*s=='\0')
return nod->nr_cuv;
if ( nod->Fiu[*s-'a'] )
return Count(nod->Fiu[*s-'a'],s+1);
return 0;
}
void Prefix(Trie *nod, char *s, int contor)
{
if(*s=='\0' || !nod->Fiu[*s-'a'] )
{
fout<<contor<< "\n";
return;
}
Prefix(nod->Fiu[*s-'a'],s+1,contor+1);
}
int main()
{
while(fin.getline(sir,Sigma))
switch(sir[0])
{
case '0':Inserare(T,sir+2);break;
case '1':Sterge(T,sir+2);break;
case '2':fout<<Count(T,sir+2)<<"\n";break;
case '3':Prefix(T,sir+2,contor);break;
}
}