Pagini recente » Cod sursa (job #2179730) | Cod sursa (job #435534) | Cod sursa (job #438658) | Cod sursa (job #1198666) | Cod sursa (job #530896)
Cod sursa(job #530896)
#include <cstdio>
using namespace std;
struct nod {
int as_word;
int as_prefix;
nod* sons[26];
nod() {
as_word = as_prefix = 0;
for (int i=0;i<26;i++) sons[i] = NULL;
}
};
nod* root = new nod;
void insert_word(char word[]) {
nod* tmp = root;
for (int i=0;word[i]!='\0';i++) {
tmp->as_prefix++;
if (tmp->sons[word[i]-'a'] == NULL) {
tmp->sons[word[i]-'a'] = new nod;
}
tmp = tmp->sons[word[i]-'a'];
}
tmp->as_prefix++;
tmp->as_word++;
}
void remove_word(char word[], int poz, nod*& curr) {
if (word[poz]=='\0') {
curr->as_word--;
curr->as_prefix--;
}
else {
int son_idx = word[poz]-'a';
remove_word(word,poz+1,curr->sons[son_idx]);
curr->as_prefix--;
if (curr->sons[son_idx]->as_word == 0 && curr->sons[son_idx]->as_prefix == 0) {
delete curr->sons[son_idx];
curr->sons[son_idx] = NULL;
}
}
}
int apparitions_count(char word[]) {
nod* tmp = root;
for (int i=0;word[i]!='\0';i++) {
if (tmp->sons[word[i]-'a'] == NULL) {
return 0;
}
tmp = tmp->sons[word[i]-'a'];
}
return tmp->as_word;
}
int max_prefix_len(char word[]) {
int i;
nod* tmp = root;
for (i=0;word[i]!='\0';i++) {
if (tmp->sons[word[i]-'a'] == NULL) {
break;
}
tmp = tmp->sons[word[i]-'a'];
}
return i;
}
int main() {
int op;
char word[21];
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
while (scanf("%d %s",&op,&word)!=EOF) {
switch(op) {
case 0:
insert_word(word);
break;
case 1:
remove_word(word,0,root);
break;
case 2:
printf("%d\n",apparitions_count(word));
break;
case 3:
printf("%d\n",max_prefix_len(word));
break;
}
}
return 0;
}