Pagini recente » Cod sursa (job #2460367) | Cod sursa (job #2049455) | Cod sursa (job #2654048) | Cod sursa (job #1090763) | Cod sursa (job #1951896)
#include <cstdio>
#include <cstring>
using namespace std;
struct Nod
{
Nod* vecini[27];
int nrVecini;
int nr;
Nod()
{
nr = 0;
nrVecini = 0;
for(int i = 0; i < 27; i++)
{
vecini[i] = NULL;
}
}
};
Nod* root;
int operatie;
int lungimeCuvant;
char cuvant[25];
void citire()
{
scanf("%d %s\n", &operatie, &cuvant);
lungimeCuvant = strlen(cuvant);
for(int i = 0; i < lungimeCuvant; i++)
{
cuvant[i] -= 'a' - 1;
}
}
void adaugareNod(Nod *x, int poz)
{
int ch = cuvant[poz];
if(ch == 0)
{
x->nr++;
return;
}
if(x->vecini[ch] == NULL)
{
x->vecini[ch] = new Nod;
x->nrVecini++;
}
adaugareNod(x->vecini[ch], poz + 1);
}
int stergereNod(Nod *x, int poz)
{
int ch = cuvant[poz];
if(ch == 0)
{
x->nr--;
}
else if(stergereNod(x->vecini[ch], poz + 1) == 1)
{
x->nrVecini--;
x->vecini[ch] = NULL;
}
if(x->nr == 0 && x->nrVecini == 0 && x != root)
{
delete x;
return 1;
}
return 0;
}
int nrAparitii(Nod *x, int poz)
{
int ch = cuvant[poz];
if(ch == 0)
{
return x->nr;
}
if(x->vecini[ch] == 0)
{
return 0;
}
else
{
return nrAparitii(x->vecini[ch], poz + 1);
}
}
int lungimePrefix(Nod *x, int poz)
{
int ch = cuvant[poz];
if(ch == 0 || x->vecini[ch] == NULL)
{
return poz;
}
return lungimePrefix(x->vecini[ch], poz + 1);
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
root = new Nod;
while(!feof(stdin))
{
citire();
switch(operatie)
{
case 0:
adaugareNod(root, 0);
break;
case 1:
stergereNod(root, 0);
break;
case 2:
printf("%d\n", nrAparitii(root, 0));
break;
case 3:
printf("%d\n", lungimePrefix(root, 0));
break;
}
}
}