Pagini recente » Cod sursa (job #931490) | Arhiva de probleme | Arhiva de probleme | Cod sursa (job #154791) | Cod sursa (job #750836)
Cod sursa(job #750836)
#include <string.h>
#include <stdio.h>
int N;
char cuv[30];
typedef struct trie
{
int x, nrfii;
char c;
trie *a[26];
trie()
{
x = nrfii = 0;
memset(a, 0, sizeof(a));
}
} *Trie;
Trie T = new trie;
void insert(Trie nod, int i)
{
if (cuv[i] == NULL)
{
nod -> x++;
return;
}
if (nod -> a[cuv[i] - 'a'] == 0)
{
nod -> a[cuv[i] - 'a'] = new trie;
nod -> nrfii++;
}
insert(nod -> a[cuv[i] - 'a'], i + 1);
}
int del(Trie nod, int i)
{
if (cuv[i] == NULL)
{
nod -> x--;
}
else if (del(nod -> a[cuv[i] - 'a'], i + 1))
{
nod -> nrfii--;
nod -> a[cuv[i] - 'a'] = 0;
}
if (nod -> x == 0 && nod -> nrfii == 0 && nod != T)
{
delete nod; return 1;
}
return 0;
}
int nr_ap(Trie nod, int i)
{
if (cuv[i] == NULL)
{
return nod -> x;
}
if (nod -> a[cuv[i] - 'a']) return nr_ap(nod -> a[cuv[i] - 'a'], i + 1);
return 0;
}
int prefix(Trie nod, int i, int k)
{
if (cuv[i] == NULL || nod -> a[cuv[i] - 'a'] == 0) return k;
return prefix(nod -> a[cuv[i] - 'a'], i + 1, k + 1);
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
int op;
while (!feof(stdin))
{
scanf("%d %s", &op, cuv);
if (feof(stdin)) break;
switch(op)
{
case 0: { insert(T, 0); break;}
case 1: { del(T, 0); break;}
case 2: { printf("%d\n",nr_ap(T, 0)); break;}
case 3: { printf("%d\n",prefix(T, 0, 0)); break;}
}
}
return 0;
}