Pagini recente » Cod sursa (job #1373448) | Cod sursa (job #2277239) | Cod sursa (job #561364) | Cod sursa (job #232284) | Cod sursa (job #1335868)
// trie
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
#include <string>
#define ch(a) ((a)-'a')
using namespace std;
struct trie {
int cnt;
int fii;
trie *son[26];
trie() {
cnt = fii = 0;
for (int i=0;i<26;i++)
son[i] = NULL;
}
~trie() {
for (int i=0;i<26;i++)
delete son[i];
}
};
ifstream f("trie.in");
ofstream g("trie.out");
trie *root;
string in;
void addOnTrie(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++;
}
addOnTrie(index+1, node->son[ch(in[index])]);
}
int queryTrie(int index, trie *node) {
if (index == in.size())
return node->cnt;
if (node->son[ch(in[index])] != NULL)
return queryTrie(index+1, node->son[ch(in[index])]);
return 0;
}
int lenTrie(int index, trie *node) {
if (index == in.size())
return 0;
if (node->son[ch(in[index])] == NULL)
return 0;
return 1+lenTrie(index+1, node->son[ch(in[index])]);
}
bool deleteOnTrie(int index, trie *node) {
bool sonDeleted;
if (index == in.size()) {
node->cnt--;
}else if (deleteOnTrie(index+1, node->son[ch(in[index])])) {
node->son[ch(in[index])] = 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;
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;
}