Pagini recente » Cod sursa (job #90742) | Cod sursa (job #731102) | Cod sursa (job #2615741) | Cod sursa (job #930398) | Cod sursa (job #1013329)
#include <fstream>
#include <vector>
#include <cstring>
#define DIM 40
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;
memset(tree_son, 0, sizeof(tree_son));
}
} *tree = new tree_node;
void add(string s) {
int i;
tree_node *node = tree;
for(i = 0; 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(!s.size()) {
if(node && --node->show_count)
return 0;
return 1;
}
if(remove(node->tree_son[s.at(0) - 'a'], s.substr(1))) {
node->tree_son[s.at(0) - 'a'] = NULL;
if(--node->son_count == 0) {
if(node != tree)
delete node;
return 1;
}
}
return 0;
}
void count(string s) {
int i;
tree_node *node = tree;
for(i = 0; 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;
for(i = 0; 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': remove(tree, s.substr(2));break;
case '2': count(s.substr(2));break;
case '3': search(s.substr(2));break;
}
fin.close();
fout.close();
return 0;
}