Pagini recente » Cod sursa (job #2602668) | Cod sursa (job #2961647) | Cod sursa (job #789454) | Cod sursa (job #2998969) | Cod sursa (job #344234)
Cod sursa(job #344234)
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstdlib>
using namespace std;
struct Trie {
int cnt,nrfii;
Trie* nodes[26];
Trie() {
cnt=nrfii=0;
memset(nodes,0,sizeof(nodes));
}
};
Trie* root = new Trie();
inline bool alpha(char c) {
return (c >= 'a' && c <= 'z');
}
void trie_insert(Trie* node,char* s) {
if (!alpha(*s)) {node->cnt++;return;}
if (node->nodes[*s-'a'] == 0) node->nodes[*s-'a'] = new Trie,node->nrfii++;
trie_insert(node->nodes[*s-'a'],s+1);
}
int trie_delete(Trie* node,char* s) {
if (!alpha(*s)) node->cnt--;
else if (trie_delete(node->nodes[*s-'a'],s+1)) {
node->nodes[*s-'a'] = 0;
node->nrfii--;
}
if (node->cnt==0 && node->nrfii==0 && node != root) {
delete node;return 1;
}
return 0;
}
int trie_query(Trie* node,char* s) {
if (!alpha(*s)) return node->cnt;
if (node->nodes[*s-'a']) return trie_query(node->nodes[*s-'a'],s+1);
return 0;
}
int trie_prefix(Trie* node,char *s,int k) {
if (!alpha(*s) || (node->nodes[*s-'a'] == 0)) return k;
return trie_prefix(node->nodes[*s-'a'],s+1,k+1);
}
int main() {
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
char s[256];
while (!feof(stdin)) {
memset(s,0,sizeof(s));
fgets(s,256,stdin);
switch (s[0]) {
case '0': trie_insert(root, s+2);break;
case '1': trie_delete(root, s+2);break;
case '2': printf("%d\n",trie_query(root, s+2));break;
case '3': printf("%d\n",trie_prefix(root, s+2, 0)); break;
}
}
fclose(stdin);
fclose(stdout);
return 0;
}