Pagini recente » Cod sursa (job #596182) | Cod sursa (job #1295241) | Cod sursa (job #1080441) | Cod sursa (job #2858336) | Cod sursa (job #1708781)
#include <cstdio>
#include <cstring>
using namespace std;
#define CH(c) (c - 'a')
struct Trie {
static const int ALPHA = 26;
Trie *son[ALPHA];
int cnt, end;
Trie() {
cnt = end = 0;
memset(son, 0, sizeof(son));
}
~Trie() {
for (int i = 0; i < ALPHA; ++i) {
if (son[ i ] != NULL) {
delete son[ i ];
}
}
}
};
void insert(Trie *node ,char *s) {
++node-> cnt;
for (int i = 0; s[ i ]; ++i) {
int x = CH( s[ i ] );
if (node->son[ x ] == NULL) {
node->son[ x ] = new Trie();
}
node = node->son[ x ];
++node->cnt;
}
++node->end;
}
void remove(Trie *node ,char *s) {
--node->cnt;
for (int i = 0; s[ i ]; ++i) {
int x = CH( s[ i ] );
if (node->son[ x ] == NULL) {
return;
}
node = node->son[ x ];
--node->cnt;
}
--node->end;
if (node->end < 0 ) {
node -> end = 0;
}
}
int search(Trie *node, char *s) {
for (int i = 0; s[ i ]; ++i) {
int x = s[ i ] - 'a' ;
if (node->son[ x ] == NULL) {
return 0;
}
node = node->son[ x ];
}
return node->end;
}
int lcp(Trie *node, char *s) {
int i;
for (i = 0; s[ i ]; ++i) {
int x = s[ i ] - 'a' ;
if (node->son[x] == NULL) {
return i;
}
node = node->son[ x ];
if (!node->cnt) {
return i;
}
}
return i;
}
int main() {
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
Trie *T = new Trie();
int op;
char s[ 25 ];
int result;
while ( scanf("%d", &op) == 1) {
scanf("%s", s);
switch(op) {
case 0:
insert(T,s);
break;
case 1:
remove(T,s);
break;
case 2:
printf("%d\n", search(T,s) );
break;
case 3:
printf("%d\n", lcp(T,s) );
break;
default:
break;
}
}
delete T;
return 0;
}