Pagini recente » Cod sursa (job #845073) | Cod sursa (job #179593) | Cod sursa (job #895693) | Cod sursa (job #3226792) | Cod sursa (job #1335884)
// trie
#include <fstream>
#include <cmath>
#include <cstring>
#include <vector>
using namespace std;
struct trie {
int cnt, fii;
trie *son[26];
trie() {
cnt = fii = 0;
for (int i=0;i<26;i++)
son[i] = NULL;
}
};
ifstream f("trie.in");
ofstream g("trie.out");
trie *root;
char in[50];
int len;
void addOnTrie(int index, trie *node) {
if (index == len) {
node->cnt++;
return;
}
if (node->son[in[index]-'a'] == NULL) {
node->fii++;
node->son[in[index]-'a'] = new trie();
}
addOnTrie(index+1, node->son[in[index]-'a']);
}
int queryTrie(int index, trie *node) {
if (index == len)
return node->cnt;
if (node->son[in[index]-'a'] == NULL)
return 0;
return queryTrie(index+1, node->son[in[index]-'a']);
}
int lenTrie(int index, trie *node) {
if (index == len)
return 0;
if (node->son[in[index]-'a'] == NULL)
return 0;
return 1+lenTrie(index+1, node->son[in[index]-'a']);
}
bool deleteOnTrie(int index, trie *node) {
if (index == len) {
node->cnt--;
}else if (deleteOnTrie(index+1, node->son[in[index]-'a'])) {
node->son[in[index]-'a'] = NULL;
node->fii--;
}
if (node != root && node->fii == 0 && node->cnt == 0) {
delete node;
return true;
}
return false;
}
void read() {
root = new trie();
int type;
while (f >> type) {
f>>in;
len = strlen(in);
if (type == 0) {
addOnTrie(0, root);
} else if (type == 1) {
deleteOnTrie(0, root);
} else if (type == 2) {
g<<queryTrie(0, root)<<endl;
} else if (type == 3) {
g<<lenTrie(0, root)<<endl;
}
}
}
int main() {
read();
f.close(); g.close();
return 0;
}