Pagini recente » Cod sursa (job #3181624) | Cod sursa (job #2597375) | Cod sursa (job #2276104) | Cod sursa (job #2405646) | Cod sursa (job #1374465)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define NMAX 30
#define C ((*p) - 'a')
using namespace std;
struct node{
int nr, nrChild;
node *child[NMAX];
node(){
nr = nrChild = 0;
memset(child, 0, sizeof(child));
}
};
node *root = new node;
char w[NMAX];
void add(node *n, char *p)
{
if (!(*p)){
n->nr++;
return;
}
if (n->child[C] == 0){
n->child[C] = new node;
n->nrChild++;
}
add(n->child[C], p+1);
}
int del(node *n, char *p)
{
if (!(*p)){
n->nr--;
}
else if (del(n->child[C], p+1)){
n->nrChild--;
n->child[C] = 0;
}
if (n->nr == 0 && n->nrChild == 0 && n != root){
delete n;
return 1;
}
return 0;
}
int numarAparitii(node *n, char *p)
{
if (!(*p)){
return n->nr;
}
if (n->child[C] == 0){
return 0;
}
return numarAparitii(n->child[C], p+1);
}
int prefComun(node *n, char *p)
{
if (!n->child[C] || !(*p)){
return 0;
}
return 1 + prefComun(n->child[C], p+1);
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
int op;
root->nr = 0;
while (!feof(stdin)){
scanf("%d %s\n", &op, &w);
switch(op){
case 0:
add(root, w);
break;
case 1:
del(root, w);
break;
case 2:
printf("%d\n", numarAparitii(root, w));
break;
case 3:
printf("%d\n", prefComun(root, w));
break;
default:
printf("-1\n");
break;
}
}
return 0;
}