Pagini recente » Cod sursa (job #910280) | Cod sursa (job #2160582) | Cod sursa (job #750590) | Cod sursa (job #2157129) | Cod sursa (job #1398413)
#include <bits/stdc++.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
class Trie {
public:
char value;
int fr, nr_sons;
Trie* next[26];
Trie();
static void add(const string&, Trie *, int);
static bool del(const string&, Trie *, int);
static int freq(const string&, Trie*, int);
static int prefix(const string&, Trie*, int);
};
Trie::Trie(){
value = '~';
fr = nr_sons = 0;
for(int i = 0; i < 26; ++i)
next[i] = NULL;
}
void Trie::add(const string &s, Trie *node, int indx = 0){
if(indx == s.size()) {
node->fr++;
return;
}
else {
if(node->next[s[indx] - 'a'] == NULL){
node->next[s[indx] - 'a'] = new Trie();
node->nr_sons++;
}
node->next[s[indx] - 'a'] -> value = s[indx];
add(s, node->next[s[indx] - 'a'], indx + 1);
}
}
bool Trie::del(const string &s, Trie *node, int indx = 0){
if (indx == s.size())
if(node->fr > 1) {
node->fr--;
return false;
}
else {
return true;
}
else {
if(del(s, node->next[s[indx] - 'a'], indx + 1))
if(node->nr_sons == 0){
delete node->next[s[indx] - 'a'];
node->next[s[indx] - 'a'] = NULL;
return true;
}
else {
node->nr_sons--;
delete node->next[s[indx] - 'a'];
node->next[s[indx] - 'a'] = NULL;
return false;
}
else
return false;
}
}
int Trie::freq(const string &s, Trie *node, int indx = 0){
if(indx == s.size())
return node->fr;
else {
if(node->next[s[indx] - 'a'] == NULL)
return 0;
else
return freq(s, node->next[s[indx] - 'a'], indx + 1);
}
}
int Trie::prefix(const string &s, Trie *node, int indx = 0){
if(indx == s.size())
return 0;
else {
if(node->next[s[indx] - 'a'] == NULL)
return 0;
else
return 1 + prefix(s, node->next[s[indx] - 'a'], indx + 1);
}
}
int main()
{
string s;
int type;
Trie* root = new Trie();
while(f>>type) {
f>>s;
switch (type){
case 0:
Trie::add(s, root);
break;
case 1:
Trie::del(s, root);
break;
case 2:
g<<Trie::freq(s, root)<<'\n';
break;
case 3:
g<<Trie::prefix(s, root)<<'\n';
break;
}
}
return 0;
}