Pagini recente » Cod sursa (job #193645) | Profil hominidu | Monitorul de evaluare | Profil hominidu | Cod sursa (job #1330641)
/// trie
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <iomanip>
#define ch(a) ((a)-'a')
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;
string in;
void insertOnTrie(int index, trie *node) {
if (index == in.size()) {
node->cnt++;
return;
}
if (node->son[ch(in[index])] == NULL) {
node->son[ch(in[index])] = new trie();
node->fii++;
}
insertOnTrie(index+1, node->son[ch(in[index])]);
}
bool deleteOnTrie(int index, trie *node) {
if (index == in.size()) {
node->cnt--;
} else if (deleteOnTrie(index+1, node->son[ch(in[index])])) {
node->fii--;
delete node->son[ch(in[index])];
node->son[ch(in[index])] = NULL;
}
if (node->fii == 0 && node->cnt == 0 && node != root) {
delete node;
return true;
}
return false;
}
int queryTrie(int index, trie *node) {
if (index == in.size()) {
return node->cnt;
}
if (node->son[ch(in[index])] == NULL)
return 0;
return queryTrie(index+1, node->son[ch(in[index])]);
}
int triePrefix(int index, trie *node) {
if (index == in.size())
return 0;
if (node->son[ch(in[index])] != NULL)
return 1+triePrefix(index+1, node->son[ch(in[index])]);
else
return 0;
}
int main() {
int type;
root = new trie();
while (f >> type) {
f>>in;
if (type == 0) {
insertOnTrie(0, root);
} else if (type == 1) {
deleteOnTrie(0, root);
} else if (type == 2) {
g<<queryTrie(0, root)<<'\n';
} else if (type == 3 ) {
g<<triePrefix(0, root)<<'\n';
}
}
f.close(); g.close();
return 0;
}