Pagini recente » Cod sursa (job #639303) | Cod sursa (job #859027) | Cod sursa (job #456354) | Cod sursa (job #3030284) | Cod sursa (job #1715911)
#include <bits/stdc++.h>
using namespace std;
char str[32];
struct TRIE {
int aps,
nbarn;
TRIE *barn[26];
TRIE() {
aps = 0;
nbarn = 0;
memset(barn, NULL, sizeof(barn));
}
} *root;
void insert(void) {
TRIE *tmp = root;
for(int i=0; str[i]; ++i) {
if(tmp->barn[str[i]-'a'])
tmp = tmp->barn[str[i]-'a'];
else {
tmp->barn[str[i]-'a'] = new TRIE();
tmp = tmp->barn[str[i]-'a'];
}
++(tmp->nbarn);
}
++(tmp->aps);
}
void remove(void) {
TRIE *tmp = root;
for(int i=0; str[i]; ++i) {
tmp = tmp->barn[str[i]-'a'];
--(tmp->nbarn);
}
--(tmp->aps);
}
int count(void) {
TRIE *tmp = root;
for(int i=0; str[i]; ++i) {
if(tmp->barn[str[i]-'a']==NULL)
return 0;
tmp = tmp->barn[str[i]-'a'];
}
return tmp->aps;
}
int pfx(void) {
TRIE *tmp = root;
int ans = 0;
for(int i=0; str[i]; ++i) {
if(tmp->barn[str[i]-'a']==NULL)
return ans;
tmp = tmp->barn[str[i]-'a'];
if(tmp->nbarn)
ans = i + 1;
else
return ans;
}
return ans;
}
int main(void) {
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
int tsk;
root = new TRIE();
while(scanf("%d %s",&tsk,str)!=EOF) {
switch(tsk) {
case 0:
insert();
break;
case 1:
remove();
break;
case 2:
printf("%d\n",count());
break;
case 3:
printf("%d\n",pfx());
break;
}}
fclose(stdin);
fclose(stdout);
return 0;
}