Pagini recente » Cod sursa (job #897939) | Cod sursa (job #168938) | Cod sursa (job #2911533) | Cod sursa (job #1871276) | Cod sursa (job #1002741)
#include <fstream>
#include <vector>
#define DIM 30
using namespace std;
ifstream fin ("trie.in");
ofstream fout ("trie.out");
struct tree_node {
int son_count, show_count;
tree_node *tree_son[DIM];
tree_node() {
son_count = show_count = 0;
for(int i = 0; i < DIM; ++i)
tree_son[i] = NULL;
}
} *tree[DIM];
void add(string s) {
if(!tree[s.at(0) - 'a'])
tree[s.at(0) - 'a'] = new tree_node;
int i;
tree_node *node = tree[s.at(0) - 'a'];
for(i = 1; i < s.size(); ++i) {
if(!node->tree_son[s.at(i) - 'a']) {
node->tree_son[s.at(i) - 'a'] = new tree_node;
++node->son_count;
}
node = node->tree_son[s.at(i) - 'a'];
}
++node->show_count;
}
bool remove(tree_node *node, string s) {
if(!node)
return 1;
if(s.size() == 1) {
if(--node->show_count == 0 && node->son_count == 0) {
delete node;
return 1;
}
return 0;
}
if(remove(node->tree_son[s.at(1) - 'a'], s.substr(1))) {
node->tree_son[s.at(1) - 'a'] = NULL;
if(--node->son_count == 0) {
delete node;
return 1;
}
}
return 0;
}
void count(string s) {
int i;
tree_node *node = tree[s.at(0) - 'a'];
if(!node) {
fout << "0\n";
return;
}
for(i = 1; i < s.size(); ++i) {
if(node->tree_son[s.at(i) - 'a'])
node = node->tree_son[s.at(i) - 'a'];
else {
fout << "0\n";
return;
}
}
fout << node->show_count << '\n';
}
void search(string s) {
int i;
tree_node *node = tree[s.at(0) - 'a'];
if(!node) {
fout << "0\n";
return;
}
for(i = 1; i < s.size(); ++i) {
if(!node->tree_son[s.at(i) - 'a'])
break;
node = node->tree_son[s.at(i) - 'a'];
}
fout << i << '\n';
}
int main() {
string s;
while(getline(fin, s))
switch(s[0]) {
case '0': add(s.substr(2));break;
case '1':
if(remove(tree[s.at(2) - 'a'], s.substr(2)))
tree[s.at(2) - 'a'] = NULL;
break;
case '2': count(s.substr(2));break;
case '3': search(s.substr(2));break;
}
fin.close();
fout.close();
return 0;
}