Pagini recente » Cod sursa (job #2382098) | Cod sursa (job #2646835) | Cod sursa (job #2813011) | Cod sursa (job #280054) | Cod sursa (job #2665634)
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
constexpr int NMAX = 21;
constexpr int SIGMAX = 'z' - 'a' + 1;
int op;
char str[NMAX];
struct Node
{
int ap = 0, sonSize = 0;
Node* sons[SIGMAX];
Node() {
for (int i = 0; i < SIGMAX; i++) {
sons[i] = 0;
}
}
Node(int ap, int sonSize) {
this->ap = ap;
this->sonSize = sonSize;
for (int i = 0; i < SIGMAX; i++) {
sons[i] = 0;
}
}
};
Node* Trie = new Node;
void update(Node* trie, char* wordptr, int op, int remLetters)
{
if (!remLetters) {
trie->ap += op;
return;
}
int curr = *wordptr - 'a';
if (trie->sons[curr] == nullptr) trie->sons[curr] = new Node, trie->sonSize++;
update(trie->sons[curr], wordptr + 1, op, remLetters - 1);
if (op == -1) {
Node* son = trie->sons[curr];
if (!son->sonSize && !son->ap) {
delete(son);
trie->sonSize--;
trie->sons[curr] = nullptr;
}
}
}
int queryAp(Node* trie, char* wordptr, int remLetters)
{
if (!remLetters) return trie->ap;
int curr = *wordptr - 'a';
if (trie->sons[curr] == nullptr) return 0;
return queryAp(trie->sons[curr], wordptr + 1, remLetters - 1);
}
int queryLCP(Node* trie, char* wordptr, int remLetters, int level)
{
if (remLetters == 0) return level;
int curr = *wordptr - 'a';
if (trie->sons[curr] == nullptr) return level;
return queryLCP(trie->sons[curr], wordptr + 1, remLetters - 1, level + 1);
}
int main() {
while (f >> op >> str + 1) {
if (op == 0) update(Trie, str + 1, 1, strlen(str + 1));
else if (op == 1) update(Trie, str + 1, -1, strlen(str + 1));
else if (op == 2) g << queryAp(Trie, str + 1, strlen(str + 1)) << '\n';
else g << queryLCP(Trie, str + 1, strlen(str + 1), 0) << '\n';
}
return 0;
}