Pagini recente » Cod sursa (job #2910519) | Cod sursa (job #2679985) | Cod sursa (job #1625432) | Cod sursa (job #974198) | Cod sursa (job #719069)
Cod sursa(job #719069)
#include <cstdio>
#include <cstring>
#define max(a, b) ((a > b) ? a : b)
using namespace std;
class trie{
public:
trie *a[26];
int nr;
int nrFii;
trie(){
nr = 0;
nrFii = 0;
memset (a, 0, sizeof(a));
}
}*r;
void adauga (trie *&r, char *q){
if (r == NULL){
r = new trie;
}
if (q[0] == 0){
r -> nr ++;
return;
}
r -> nrFii ++;
adauga (r -> a[q[0] - 'a'], q + 1);
}
int sterge (trie *&r, char *q)
{
if (q[0] == 0){
r -> nr --;
if (r -> nrFii == 0 && r -> nr == 0){
delete r;
return 1;
}
return 0;
}
r -> nrFii --;
if (sterge (r -> a[q[0] -'a'], q + 1)){
r -> a[q[0] - 'a'] = 0;
}
if (r -> nrFii == 0 && r -> nr == 0){
delete r;
return 1;
}
return 0;
}
void aparitii (trie *&r, char *q)
{
if (q[0] == 0 || r == NULL){
if (r == NULL){
printf ("0\n");
return;
}
printf ("%d\n", r -> nr);
return;
}
aparitii (r -> a[q[0] - 'a'], q + 1);
}
int prefix (trie *&r, char *q, int nivel){
if (q[0] == 0 || r -> a[q[0] - 'a' ] == 0){
return nivel;
}
return prefix (r -> a[q[0] - 'a'], q + 1, nivel + 1);
}
void citire()
{
int caz;
int z;
while (scanf ("%d", &caz) == 1){
char q[30];
scanf ("%s", q);
switch (caz){
case 0:
adauga (r, q);
break;
case 1:
z = sterge (r, q);
break;
case 2:
aparitii (r, q);
break;
case 3:
printf ("%d\n", prefix (r, q, 0));
//printf ("caz3\n");
break;
}
}
}
int main()
{
freopen ("trie.in", "r", stdin);
freopen ("trie.out", "w", stdout);
citire();
return 0;
}