Pagini recente » Cod sursa (job #2674741) | Cod sursa (job #1366338) | Cod sursa (job #2090032) | Cod sursa (job #1972060) | Cod sursa (job #1329433)
/// 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->fii++;
node->son[ch(in[index])] = new trie();
}
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--;
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, int k) {
if (index == in.size())
return k;
if (node->son[ch(in[index])] != NULL)
return triePrefix(index+1, node->son[ch(in[index])], k+1);
else
return k;
}
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, 0)<<'\n';
}
}
f.close(); g.close();
return 0;
}