Pagini recente » Cod sursa (job #2340808) | Cod sursa (job #2975930) | Cod sursa (job #1536196) | Cod sursa (job #2120757) | Cod sursa (job #2180636)
#include <bits/stdc++.h>
using namespace std;
const int NMax = 33;
const int SIGMA = 30;
ifstream f("trie.in");
ofstream g("trie.out");
struct TRIE{
int value;
int prefix;
struct TRIE *edges[SIGMA];
};
char y[NMax];
char *p;
int x;
TRIE *root;
void add_trie(TRIE *node){
char edge = *p - 'a';
if(node != root){
node->prefix++;
}
if(*p == 0){
node->value++;
return;
}
if(!node->edges[edge]){
TRIE *aux;
aux = new TRIE;
aux->value = 0;
for(int i = 0; i < SIGMA; ++i){
aux->edges[i] = NULL;
aux->prefix = 0;
}
node->edges[edge] = aux;
p++;
add_trie(node->edges[edge]);
return;
}
p++;
add_trie(node->edges[edge]);
}
void delete_trie(TRIE *node){
char edge = *p - 'a';
if(node != root){
node->prefix--;
}
if(*p == 0){
node->value--;
return;
}
p++;
delete_trie(node->edges[edge]);
}
void afisare_trie(TRIE *node){
char edge = *p - 'a';
if(*p == 0){
g << node->value << '\n';
return;
}
if(!node->edges[edge]){
g << 0 << '\n';
return;
}
p++;
afisare_trie(node->edges[edge]);
}
void prefix_trie(TRIE *node,int len){
char edge = *p - 'a';
if(*p == 0){
g << len << '\n';
return;
}
if(!node->edges[edge]){
g << len << '\n';
return;
}
if(node->edges[edge]->prefix < 1){
g << len << '\n';
return;
}
p++;
prefix_trie(node->edges[edge], len + 1);
}
int main()
{
root = new TRIE;
root->prefix = 2;
for(int i = 0; i < SIGMA; ++i){
root->edges[i] = NULL;
}
while(f >> x){
f.getline(y,NMax);
p = y;
p++;
if(x == 0){
add_trie(root);
}else
if(x == 1){
delete_trie(root);
}else
if(x == 2){
afisare_trie(root);
}else
if(x == 3){
prefix_trie(root,0);
}
}
return 0;
}