Pagini recente » Cod sursa (job #979620) | Cod sursa (job #1890041) | Cod sursa (job #1126938) | Cod sursa (job #1330480) | Cod sursa (job #1325247)
#include <cstdio>
#include <cstring>
struct Node {
char letter;
int counter;
int wordEnd;
Node* next[26];
}*Trie;
int cmd;
char word[21];
void add(char *word) {
Node *p = Trie;
char c;
for (int i=0; i<strlen(word); ++i) {
c = word[i] - 'a';
if (p->next[c] == NULL)
p->next[c] = new Node;
p = p->next[c];
p->letter = word[i];
p->counter++;
}
p->wordEnd++;
}
void rem(Node *n, char *word) {
if (*word == NULL)
return;
bool del = false;
Node *p = n->next[*word - 'a'];
if (*(word+1) == NULL)
p->wordEnd--;
p->counter--;
if (p->counter == 0)
del = true;
rem(p, word+1);
if (p->counter == 0)
delete p;
if (del)
p = NULL;
}
int app(char *word) {
Node *p = Trie;
char c;
for (int i=0; i<strlen(word); ++i) {
c = word[i] - 'a';
if (!p->next[c])
return 0;
p = p->next[c];
}
return p->wordEnd;
}
int prefix(char *word) {
Node *p = Trie;
char c;
for (int i=0; i<strlen(word); ++i) {
c = word[i] - 'a';
if (p->next[c] == NULL)
return i;
p = p->next[c];
}
return strlen(word);
}
int main () {
freopen("trie.in", "rt", stdin);
freopen("trie.out", "wt", stdout);
Trie = new Node;
while (!feof(stdin)) {
scanf("%d %s\n", &cmd, word);
switch (cmd) {
case 0:
add(word);
break;
case 1:
rem(Trie, word);
break;
case 2:
printf("%d\n",app(word));
break;
case 3:
printf("%d\n",prefix(word));
break;
}
}
return 0;
}