Pagini recente » Cod sursa (job #1147295) | Cod sursa (job #377200) | Cod sursa (job #192895) | Cod sursa (job #1605385) | Cod sursa (job #2974444)
#include <bits/stdc++.h>
using namespace std;
const int SIGMA = 'z' - 'a' + 1;
struct trie_node_t {
int end_count; // numarul de cuvinte care se termina in nodul curent
int passing_count; // numarul de cuvinte care trec prin nodul asta
trie_node_t* sons[SIGMA];
trie_node_t() {
end_count = 0;
passing_count = 0;
memset(sons, 0, sizeof(sons));// face fiecare son sa fie = NULL
}
};
// noi vrem incepand in nodul root sa inseram stringul s incepand de la pozitia pos
void insert(trie_node_t* root, const string &s, int pos){
root->passing_count += 1;
if(pos >= (int)s.size()) {
root->end_count += 1;
return ;
}
int son_index = s[pos] - 'a';
if(root->sons[son_index] == NULL){
root->sons[son_index] = new trie_node_t();
}
insert(root->sons[son_index], s, pos + 1);
}
void remove(trie_node_t* root, const string &s, int pos){
root->passing_count -= 1;
if(pos >= (int)s.size()) {
root->end_count -= 1;
return ;
}
int son_index = s[pos] - 'a';
remove(root->sons[son_index], s, pos + 1);
}
int get_frequency(trie_node_t* root, const string &s, int pos) {
if(pos >= (int)s.size()){
return root->end_count;
}
int son_index = s[pos] - 'a';
if(root->sons[son_index] == NULL){
return 0;
}
return get_frequency(root->sons[son_index], s, pos + 1);
}
int get_lcp(trie_node_t* root, const string &s, int pos){
if(pos >= (int)s.size()) {
return 0;
}
int son_index = s[pos] - 'a';
if(root->sons[son_index] == NULL || root->sons[son_index]->passing_count == 0){
return 0;
}
return 1 + get_lcp(root->sons[son_index], s, pos + 1);
}
int main() {
ifstream f("trie.in");
ofstream g("trie.out");
int op;
string s;
trie_node_t* root = new trie_node_t();
while(f >> op >> s) {
if(op == 0) {
insert(root, s, 0);
} else if (op == 1) {
remove(root, s, 0);
} else if(op == 2) {
g << get_frequency(root, s, 0) << "\n";
} else {
g << get_lcp(root, s, 0) << "\n";
}
}
f.close();
g.close();
return 0;
}