Pagini recente » Cod sursa (job #1325031) | Cod sursa (job #2918612) | Cod sursa (job #1699829) | Cod sursa (job #279074) | Cod sursa (job #1701038)
#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) {
if(t == 0)
return -1;
else if(cuv[i] == '\0')
return -1;
else
return prefix(cuv, i + 1, t -> next[cuv[i] - 'a']) + 1;
}
char ch;
void readWord(FILE *fin) {
int i;
i = 0;
while(ch != '\n') {
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));
}
fclose( fin );
fclose( fout );
return 0;
}