Pagini recente » Cod sursa (job #3226149) | Cod sursa (job #1459609) | Cod sursa (job #2874086) | Cod sursa (job #2538276) | Cod sursa (job #998126)
Cod sursa(job #998126)
#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[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(s.size() == 1) {
if(node && --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;
}