Pagini recente » Cod sursa (job #1676683) | Cod sursa (job #6155) | Cod sursa (job #94620) | Cod sursa (job #2973629) | Cod sursa (job #2665640)
#include <bits/stdc++.h>
using namespace std;
ifstream f ("trie.in");
ofstream g ("trie.out");
constexpr int SIGMA = 26;
constexpr int NMAX = 25;
char s[NMAX];
struct Node {
int cnt;
int fii;
Node *Next[SIGMA];
Node () {
cnt = 0;
fii = 0;
for (int i = 0; i <= 25; ++ i )
Next[i] = nullptr;
}
};
Node *Tree = new Node;
void Update (Node *Tree, char *cuvant, int val, int Nr_Lit) {
if (Nr_Lit == 0) {
Tree->cnt += val;
return;
}
int lit = (int)(*cuvant - 'a');
if (Tree->Next[lit] == nullptr) {
++ Tree->fii;
Tree -> Next[lit] = new Node;
}
Update(Tree -> Next[lit], cuvant + 1, val, Nr_Lit - 1);
if (val == -1) {
Node *F = Tree -> Next[lit];
if (F -> cnt == 0 && F -> fii == 0) {
delete(F);
-- Tree -> fii;
Tree -> Next[lit] = nullptr;
}
}
}
int Query_Ap (Node *Tree, char *cuvant, int Nr_Lit) {
if (Nr_Lit == 0) return Tree -> cnt;
int lit = (int)(*cuvant - 'a');
if (Tree -> Next[lit] == nullptr)
return 0;
return Query_Ap(Tree -> Next[lit], cuvant+1, Nr_Lit-1);
}
int Query_LCP (Node *Tree, char *cuvant, int Nr_Lit, int Level) {
if (Nr_Lit == 0)
return Level;
int lit = (int)(*cuvant-'a');
if (Tree -> Next[lit] == nullptr)
return Level;
return Query_LCP(Tree -> Next[lit], cuvant + 1, Nr_Lit - 1, Level+1);
}
int main()
{
int T;
while (f >> T >> (s+1)) {
if (T == 0) Update(Tree, (s+1), 1, strlen(s+1));
else if (T == 1) Update(Tree, (s+1), -1, strlen(s+1));
else if (T == 2) {
g << Query_Ap(Tree, (s+1), strlen(s+1)) << '\n';
}
else g << Query_LCP(Tree, (s+1), strlen(s+1), 0) << '\n';
}
return 0;
}