Pagini recente » Cod sursa (job #1514024) | Cod sursa (job #2535330) | Cod sursa (job #2319799) | Cod sursa (job #3249375) | Cod sursa (job #2844734)
#include <bits/stdc++.h>
using namespace std;
const long long NR = 1e6 + 10;
const long long MOD = 1LL << 32;
struct node {
node *chr[26]{};
int token;
node() {
for (auto &i : chr) {
i = nullptr;
}
token = 0;
}
} *root;
string s;
void add() {
node *curr = root;
for (char i : s) {
if (curr->chr[i - 'a'] == nullptr) {
curr->chr[i - 'a'] = new node;
}
curr = curr->chr[i - 'a'];
}
++curr->token;
}
bool sub(node *curr, int pos) {
if (pos == s.size()) {
--curr->token;
} else {
if (sub(curr->chr[s[pos] - 'a'], pos + 1)) {
curr->chr[s[pos] - 'a'] = nullptr;
delete curr->chr[s[pos] - 'a'];
}
}
bool ret = true;
for (auto &i : curr->chr) {
ret &= i == nullptr;
}
if (curr->token) {
ret = false;
}
return ret;
}
int count() {
node *curr = root;
for (int i = 0; i < s.size(); ++i) {
if (curr->chr[s[i] - 'a'] == nullptr)
return 0;
curr = curr->chr[s[i] - 'a'];
}
return curr->token;
}
int len() {
node *curr = root;
for (int i = 0; i < s.size(); ++i) {
if (curr->chr[s[i] - 'a'] == nullptr)
return i;
curr = curr->chr[s[i] - 'a'];
}
return s.size();
}
int op;
ifstream in("trie.in");
ofstream out("trie.out");
signed main() {
ios::sync_with_stdio(0);
in.tie(0);
root = new node();
while (in >> op >> s) {
if (op == 0) {
add();
}
if (op == 1) {
sub(root, 0);
}
if (op == 2) {
out << count() << '\n';
}
if (op == 3) {
out << len() << '\n';
}
}
return 0;
}