Pagini recente » Cod sursa (job #86208) | Cod sursa (job #647149) | Cod sursa (job #1378716) | Cod sursa (job #1730099) | Cod sursa (job #3175398)
#include <bits/stdc++.h>
using namespace std;
namespace Trie {
struct Node {
Node *next[26];
int cnt, aux;
Node() {
this->cnt = this->aux = 0;
for (int i = 0; i < 26; i++) {
this->next[i] = nullptr;
}
}
};
Node *root;
void add(Node *node, string word, int pos) {
node->aux++;
if (pos == word.size()) {
node->cnt++;
return;
}
if (node->next[word[pos] - 'a'] == nullptr) {
node->next[word[pos] - 'a'] = new Node;
}
add(node->next[word[pos] - 'a'], word, pos + 1);
}
void rem(Node *node, string word, int pos) {
node->aux--;
if (pos == word.size()) {
node->cnt--;
return;
}
rem(node->next[word[pos] - 'a'], word, pos + 1);
}
int freq(Node *node, string word, int pos) {
if (pos == word.size()) {
return node->cnt;
}
if (node->next[word[pos] - 'a'] == nullptr) {
return 0;
}
return freq(node->next[word[pos] - 'a'], word, pos + 1);
}
int pref(Node *node, string word, int pos) {
if (pos == word.size()) {
return pos;
}
if (node->next[word[pos] - 'a'] == nullptr || node->next[word[pos] - 'a']->aux == 0) {
return pos;
}
return pref(node->next[word[pos] - 'a'], word, pos + 1);
}
}
signed main() {
ifstream fin("trie.in");
ofstream fout("trie.out");
Trie::root = new Trie::Node;
int task;
string word;
while (fin >> task >> word) {
if (task == 0) {
Trie::add(Trie::root, word, 0);
} else if (task == 1) {
Trie::rem(Trie::root, word, 0);
} else if (task == 2) {
fout << Trie::freq(Trie::root, word, 0) << '\n';
} else {
fout << Trie::pref(Trie::root, word, 0) << '\n';
}
}
return 0;
}