Pagini recente » Cod sursa (job #1923459) | Cod sursa (job #2602751) | Cod sursa (job #997667) | Cod sursa (job #1257534) | Cod sursa (job #2449684)
#include <bits/stdc++.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
const int n = 26;
struct trie
{
int fv, end;
trie *next[26];
trie()
{
this -> fv = 0;
this -> end = 0;
memset(this->next, NULL, sizeof(this->next));
}
};
trie *root = new trie();
namespace task
{
void add(trie *nod, string &sir, int i)
{
nod -> fv ++;
if(i == sir.length())
nod -> end ++;
else
{
int next_letter = sir[i] - 'a';
assert(next_letter >= 0 && next_letter <= 26);
if (nod -> next[next_letter] == nullptr)
nod -> next[next_letter] = new trie();
add(nod -> next[next_letter], sir, i + 1);
}
}
void erase(trie *&nod, string &sir, int i)
{
assert(nod -> fv !=0);
nod -> fv --;
if (i == sir.length())
nod -> end --;
else
{
int next_letter = sir[i] - 'a';
assert(next_letter >= 0 && next_letter <= 26);
assert(nod -> next[next_letter] != nullptr);
erase(nod -> next[next_letter], sir, i + 1);
}
if (nod != root && nod -> fv == 0)
{
delete nod;
nod = nullptr;
}
}
int how_many(trie *nod, string &sir, int i)
{
assert(nod -> fv !=0);
if (i == sir.length())
return nod -> end;
int next_letter = sir[i] - 'a';
if (nod -> next[next_letter] == nullptr)
return 0;
return how_many(nod -> next[next_letter], sir, i + 1);
}
int get_prefix(trie *nod, string &sir, int i)
{
assert(nod -> fv !=0);
if (i < sir.length())
{
int next_letter = sir[i] - 'a';
if (nod -> next[next_letter] != nullptr)
return get_prefix(nod -> next[next_letter], sir, i + 1);
else
return i;
}
return i;
}
}
int main()
{
int op;
string sir;
while (f >> op >> sir)
{
if (op == 0)
task :: add(root, sir, 0);
else if (op == 1)
task :: erase(root, sir, 0);
else if (op == 2)
g << task :: how_many(root, sir, 0) << '\n';
else
g << task :: get_prefix(root, sir, 0) << '\n';
}
}