Pagini recente » Cod sursa (job #587345) | Cod sursa (job #373225) | Cod sursa (job #1265981) | Cod sursa (job #170232) | Cod sursa (job #2018449)
#include <iostream>
#include <cstdio>
using namespace std;
FILE *in, *out;
const int litmax = 26;
const int nmax = 20;
struct Trie {
int pref; //drumul de la radacina pana in acest nod este prefix pentru $pref cuvinte
Trie* son[litmax]; //son[0] corespunde sagetii cu litera 'A'. son[1] .. cu liter B...
};
Trie* root;
void addtrie(Trie* node, char* cuv) {
node -> pref ++;
if(*cuv != '\0') {
int pos = *cuv - 'a';
if(node -> son[pos] == NULL) {
node -> son[pos] = new Trie();
node -> son[pos] -> pref = 0;
}
addtrie(node -> son[pos], cuv + 1);
}
}
void deltrie(Trie* node, char* cuv) {
node -> pref --;
if(*cuv != '\0') {
int pos = *cuv - 'a';
deltrie(node -> son[pos], cuv + 1);
}
}
int aparitii(Trie* node, char* cuv) {
if(*cuv != '\0') {
int pos = *cuv - 'a';
return aparitii(node -> son[pos],cuv + 1);
} else {
int answer = node->pref;
for(int i = 0; i < litmax; i++)
if(node -> son[i] != NULL)
answer -= (node -> son[i] -> pref);
return answer;
}
}
int prefix(Trie* node, char* cuv, int lung = 0) {
if(*cuv != '\0') {
int pos = *cuv - 'a';
if(node -> son[pos] != NULL && node -> son[pos] -> pref > 0)
lung = prefix(node -> son[pos], cuv+1, lung + 1);
}
return lung;
}
int main() {
in = fopen("trie.in", "r");
out = fopen("trie.out", "w");
int op;
char cuv[nmax + 3];
root = new Trie();
while(fscanf(in,"%d %s", &op, &cuv) != EOF) {
if(op == 0)
addtrie(root, cuv);
else if(op == 1)
deltrie(root, cuv);
else if(op == 3)
fprintf(out, "%d\n", prefix(root, cuv));
else if(op == 2)
fprintf(out,"%d\n", aparitii(root,cuv));
}
return 0;
}