Pagini recente » Cod sursa (job #430481) | Cod sursa (job #322290) | Cod sursa (job #3240593) | Cod sursa (job #2693738) | Cod sursa (job #1701041)
#include <cstdio>
#include <cstring>
const int MAX_LITERE = 20;
char cuv[MAX_LITERE+1];
struct Trie {
int aparitii, fii;
Trie* next[26];
Trie() {
aparitii = fii = 0;
memset(next, 0, sizeof(next));
}
}*myTrie;
void addCuv(char* cuv, int i, Trie *t) {
if(cuv[i] == '\0')
t -> aparitii++;
else {
if(t->next[cuv[i] - 'a'] == 0) {
t->next[cuv[i] - 'a'] = new Trie;
t->fii++;
}
addCuv(cuv, i + 1, t -> next[cuv[i] - 'a']);
}
}
int delCuv(char* cuv, int i, Trie *t) {
int rez;
if(cuv[i] == '\0')
t -> aparitii--;
else {
rez = delCuv(cuv, i + 1, t -> next[cuv[i] - 'a']);
if(rez == 1) {
t -> next[cuv[i] - 'a'] = 0;
t -> fii--;
}
}
if(t -> fii == 0 && t -> aparitii == 0 && t != myTrie) {
delete t;
return 1;
}
return 0;
}
int query(char *cuv, int i, Trie *t) {
if(t == 0) {
return 0;
} else if(cuv[i] == '\0')
return t -> aparitii;
else
return query(cuv, i + 1, t -> next[cuv[i] - 'a']);
}
int prefix(char *cuv, int i, Trie *t, int acum) {
if(cuv[i] == '\0' || t -> next[cuv[i] - 'a'] == 0)
return acum;
else
return prefix(cuv, i + 1, t -> next[cuv[i] - 'a'], acum + 1);
}
char ch;
void readWord(FILE *fin) {
int i;
i = 0;
while(ch != '\n' && ch != EOF) {
cuv[i] = ch;
i++;
ch = fgetc(fin);
}
cuv[i] = '\0';
}
int main() {
int tipQuery;
myTrie = new Trie;
FILE *fin = fopen( "trie.in" , "r" );
FILE *fout = fopen( "trie.out" , "w" );
while(fscanf(fin, "%d", &tipQuery) == 1) {
ch = fgetc(fin);
while(ch == ' ')
ch = fgetc(fin);
readWord(fin);
if(tipQuery == 0)
addCuv(cuv, 0, myTrie);
else if(tipQuery == 1)
delCuv(cuv, 0, myTrie);
else if(tipQuery == 2)
fprintf(fout, "%d\n", query(cuv, 0, myTrie));
else
fprintf(fout, "%d\n", prefix(cuv, 0, myTrie, 0));
}
fclose( fin );
fclose( fout );
return 0;
}