Pagini recente » Cod sursa (job #118061) | Cod sursa (job #758356) | Cod sursa (job #1077870) | Cod sursa (job #3173652) | Cod sursa (job #1385750)
#include <fstream>
#include <cstring>
#define CH (s[i]-'a')
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie
{
int info, nrfii;
Trie* fiu[26];
Trie()
{
info = nrfii = 0;
memset(fiu, 0, sizeof(fiu));
}
} *prim;
char s[25];
int lg;
void adauga(Trie* nod, int i)
{
if(s[i] == '\0')
{
nod->info++;
return;
}
if(nod->fiu[ CH ] == 0)
{
nod->fiu[ CH ] = new Trie;
nod->nrfii++;
}
adauga(nod->fiu[ CH ], i+1);
}
int sterge(Trie* nod, int i)
{
if(s[i] == '\0')
{
nod->info--;
}
else
if( sterge(nod->fiu[ CH ], i+1) )
{
nod->fiu[ CH ] = 0;
nod->nrfii--;
}
if(nod->info==0 && nod->nrfii==0 && nod!=prim)
{
delete nod;
return 1;
}
return 0;
}
int nr_apar(Trie* nod, int i)
{
if(s[i] == '\0')
{
return nod->info;
}
if(nod->fiu[ CH ])
{
return nr_apar(nod->fiu[ CH ], i+1);
}
return 0;
}
int nr_pref(Trie* nod, int i, int k)
{
if(s[i] == '\0' || nod->fiu[ CH ] == 0)
{
return k;
}
return nr_pref(nod->fiu[ CH ], i+1, k+1);
}
int main()
{
prim = new Trie;
int tip;
while(fin>>tip>>s)
{
lg = strlen(s);
switch(tip)
{
case 0: adauga(prim, 0); break;
case 1: sterge(prim, 0); break;
case 2: fout<<nr_apar(prim, 0)<<'\n'; break;
case 3: fout<<nr_pref(prim, 0, 0)<<'\n'; break;
}
fin.get();
}
fin.close(); fout.close();
return 0;
}