Pagini recente » Cod sursa (job #1298325) | Cod sursa (job #1118274) | Cod sursa (job #1266812) | Cod sursa (job #822860) | Cod sursa (job #1701037)
#include <cstdio>
#include <cstring>
const int MAX_LITERE = 20;
char cuv[MAX_LITERE+1];
struct Trie {
int aparitii, treceri;
Trie* next[26];
Trie() {
aparitii = treceri = 0;
memset(next, 0, sizeof(next));
}
}*myTrie;
void addCuv(char* cuv, int i, Trie *t) {
t -> treceri++;
if(cuv[i] == '\0')
t -> aparitii++;
else {
if(t->next[cuv[i] - 'a'] == 0)
t->next[cuv[i] - 'a'] = new Trie;
addCuv(cuv, i + 1, t -> next[cuv[i] - 'a']);
}
}
int delCuv(char* cuv, int i, Trie *t) {
int rez;
t -> treceri--;
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;
}
if(t -> treceri == 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;
}