Pagini recente » Cod sursa (job #150649) | Cod sursa (job #839119) | Cod sursa (job #2746627) | Cod sursa (job #1299156) | Cod sursa (job #1963636)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct Nod
{
int nr_aparitii, nr_copii;
Nod *fii[30];
Nod();
};
Nod::Nod()
{
nr_aparitii = 0;
nr_copii = 0;
for(int i = 0 ; i <= 27 ; ++i)
{
fii[i] = NULL;
}
}
int lungime;
char s[30];
bool scad;
int valoare(char c)
{
return (c - 'a');
}
void add(Nod *&nod, int poz)
{
if(poz == lungime)
{
nod->nr_aparitii++;
return;
}
int poz_fiu = valoare(s[poz]);
if(!nod->fii[poz_fiu])
{
nod->fii[poz_fiu] = new Nod;
nod->nr_copii++;
}
add(nod->fii[poz_fiu], poz + 1);
}
int destroy(Nod *&nod, int poz)
{
if(poz == lungime)
{
nod->nr_aparitii--;
if(!nod->nr_aparitii && !nod->nr_copii)
{
delete nod;
nod = NULL;
return 1;
}
return 0;
}
int poz_fiu = valoare(s[poz]);
if(destroy(nod->fii[poz_fiu], poz + 1))
{
if(!nod->nr_aparitii && !nod->nr_copii)
{
delete nod;
nod = NULL;
}
else
{
if(scad == true)
{
nod->nr_copii--;
scad = false;
}
}
}
}
void afisare(Nod *nod, int poz)
{
if(poz == lungime)
{
printf("%d\n", nod->nr_aparitii);
return;
}
int poz_fiu = valoare(s[poz]);
afisare(nod->fii[poz_fiu], poz + 1);
}
void prefix(Nod *nod, int poz)
{
int poz_fiu = valoare(s[poz]);
if(!nod->fii[poz_fiu])
{
printf("%d\n", poz);
return;
}
prefix(nod->fii[poz_fiu], poz + 1);
}
void citire()
{
int operatie;
Nod *root = new Nod;
while(!feof(stdin))
{
scanf("%d %s\n", &operatie, &s);
lungime = strlen(s);
scad = true;
switch (operatie)
{
case 0: add(root, 0); break;
case 1: destroy(root, 0); break;
case 2: afisare(root, 0); break;
case 3: prefix(root, 0); break;
}
}
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
citire();
return 0;
}