Pagini recente » Cod sursa (job #2724927) | Cod sursa (job #447671) | Cod sursa (job #1359083) | Cod sursa (job #1815575) | Cod sursa (job #2049508)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
#define lim 26
struct trie
{
int nr=0, nrfii=0;
trie *fiu[lim]={0};
} *T;
void adauga (char cuv[], trie *nod)
{
if (cuv[0]==0)
{
nod->nr++;
return;
}
int x = cuv[0] - 'a';
if (nod->fiu[x] == 0)
{
nod->fiu[x] = new trie;
nod->nrfii++;
}
adauga (cuv+1, nod->fiu[x]);
}
void sterge (char *cuv, trie *nod)
{
if (cuv[0]==0)
nod->nr--;
else
{
int x = cuv[0] - 'a';
sterge (cuv+1, nod->fiu[x]);
if (nod->fiu[x]->nrfii==0 && nod->fiu[x]->nr==0)
{
delete nod->fiu[x];
nod->fiu[x]=0;
nod->nrfii--;
}
}
return;
}
int nr_aparitii (char *cuv, trie *nod)
{
if (cuv[0]==0)
return nod->nr;
int x = cuv[0] - 'a';
if (nod->fiu[x]==0)
return 0;
nr_aparitii (cuv+1, nod->fiu[x]);
}
int lpref_maxim (char *cuv, trie *nod)
{
if (cuv[0]==0)
return 0;
int x = cuv[0] - 'a';
if (nod->fiu[x]==0)
return 0;
return 1 + lpref_maxim (cuv+1, nod->fiu[x]);
}
int main()
{
int tip;
char cuv[30];
T = new trie;
while (fin>>tip)
{
fin>>cuv;
if (tip==0) adauga (cuv, T);
if (tip==1) sterge (cuv, T);
if (tip==2) fout<<nr_aparitii (cuv, T)<<'\n';
if (tip==3) fout<<lpref_maxim (cuv, T)<<'\n';
}
fin.close();
fout.close();
return 0;
}