Pagini recente » Cod sursa (job #193182) | Cod sursa (job #2846308) | Cod sursa (job #559208) | Cod sursa (job #1929053) | Cod sursa (job #2665600)
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
const int NMAX = 21;
const int SIGMAX = (int)('z' - 'a' + 1);
int Q, Type;
char S[NMAX];
struct Node
{
int ap; /// nr aparitii cuvant;
int nr; /// nr fii activi;
Node *Next[SIGMAX];
Node ()
{
ap = nr = 0;
for(int i = 0; i <= (int)('z' - 'a'); ++i)
Next[i] = nullptr;
}
} *Trie = new Node;
static inline void Update (Node *tree, char *word, int val, int rem_lett)
{
if(rem_lett == 0)
{
tree -> ap += val;
return;
}
int now = (int)(*word - 'a');
if(tree -> Next[now] == nullptr)
tree -> Next[now] = new Node, tree -> nr += 1;
Update(tree -> Next[now], word + 1, val, rem_lett - 1);
///
if(val == -1)
{
Node *Son = tree -> Next[now];
if(Son -> ap == 0 && Son -> nr == 0)
delete(Son), tree -> Next[now] = nullptr, --tree -> nr;
}
///
return;
}
static inline int Query_Ap (Node *tree, char *word, int rem_lett)
{
if(rem_lett == 0)
return tree -> ap;
int now = (int)(*word - 'a');
if(tree -> Next[now] == nullptr)
return 0;
return Query_Ap(tree -> Next[now], word + 1, rem_lett - 1);
}
static inline int Query_LCP (Node *tree, char *word, int rem_lett, int lvl)
{
if(rem_lett == 0)
return lvl;
int now = (int)(*word - 'a');
if(tree -> Next[now] == nullptr)
return lvl;
return Query_LCP(tree -> Next[now], word + 1, rem_lett - 1, lvl + 1);
}
int main()
{
f.tie(nullptr);
while(f >> Type >> (S + 1))
{
if(Type == 0)
Update(Trie, S + 1, 1, (int)strlen(S + 1));
else if(Type == 1)
Update(Trie, S + 1, -1, (int)strlen(S + 1));
else if(Type == 2)
g << Query_Ap(Trie, S + 1, (int)strlen(S + 1)) << '\n';
else
g << Query_LCP(Trie, S + 1, (int)strlen(S + 1), 0) << '\n';
}
return 0;
}