Pagini recente » Cod sursa (job #837198) | Cod sursa (job #945159) | Cod sursa (job #850063) | Cod sursa (job #135696) | Cod sursa (job #1458494)
#include <stdio.h>
#include <string.h>
#define poz (*s - 'a')
using namespace std;
typedef struct Trie{
int nrfii, cnt;
Trie *fiu[26];
Trie(){
nrfii = cnt = 0;
memset(fiu, 0, sizeof(fiu));
}
} Trie;
Trie *T = new Trie;
void pushTrie(Trie* node, char* s);
int popTrie(Trie* node, char* s);
int number(Trie* node, char* s);
int prefix(Trie* node, char* s);
int main(){
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
char s[25];
while(fgets(s, 25, stdin))
switch(s[0]){
case '0': pushTrie(T, s + 2); break;
case '1': popTrie(T, s + 2); break;
case '2': printf("%d\n", number(T, s + 2)); break;
default: printf("%d\n", prefix(T, s + 2));
}
return 0;
}
void pushTrie(Trie* node, char* s){
if(*s == '\n'){
node->cnt++;
return;
}
if(!node->fiu[poz]){
node->fiu[poz] = new Trie;
node->nrfii++;
}
pushTrie(node->fiu[poz], s + 1);
}
int popTrie(Trie* node, char* s){
if(*s == '\n')
node->cnt--;
else if(popTrie(node->fiu[poz], s + 1)){
node->fiu[poz] = NULL;
node->nrfii--;
}
if(node->cnt == 0 && node->nrfii == 0 && node != T){
delete node;
return 1;
}
return 0;
}
int number(Trie* node, char* s){
if(*s == '\n')
return node->cnt;
if(node->fiu[poz])
return number(node->fiu[poz], s + 1);
return 0;
}
int prefix(Trie* node, char* s){
if(*s == '\n')
return 0;
if(!node->fiu[poz])
return 0;
return prefix(node->fiu[poz], s + 1) + 1;
}