Pagini recente » Cod sursa (job #1932133) | Cod sursa (job #1233905) | Cod sursa (job #2687030) | Cod sursa (job #1158474) | Cod sursa (job #3319998)
#include <bits/stdc++.h>
using namespace std;
struct trie {
int son,cnt;
trie* v[30];
trie() {
son = cnt = 0;
for (int i = 0;i <= 28;i++)
v[i] = nullptr;
}
};
trie* root = new trie;
void add(int i, string& s, trie* node) {
if (i == s.size()) {
node->cnt++;
return;
}
int ind = s[i] - 'a' + 1;
if (!node->v[ind]) {
node->son++;
node->v[ind] = new trie;
}
add(i + 1, s, node->v[ind]);
}
bool check(trie* node) {
return (!node->cnt && !node->son && node != root);
}
bool del(int i, string& s, trie* node) {
if (i == s.size()) {
if (node->cnt)
node->cnt--;
if (check(node)) {
delete node;
return true;
}
return false;
}
int ind = s[i] - 'a' + 1;
if (del(i + 1, s, node->v[ind])){
node->son--;
node->v[ind] = nullptr;
}
if (check(node)) {
delete node;
return true;
}
return false;
}
int cnt(int i, string& s, trie* node) {
if (i == s.size())
return node->cnt;
int ind = s[i] - 'a' + 1;
if (!node->v[ind])
return 0;
return cnt(i + 1, s, node->v[ind]);
}
int pref(int i, string& s, trie* node) {
if (i == s.size())
return i;
int ind = s[i] - 'a' + 1;
if (!node->v[ind])
return i;
return pref(i + 1, s, node->v[ind]);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
ifstream fin("trie.in");
ofstream fout("trie.out");
int op;
string s;
while (fin >> op >> s) {
if (op == 0)
add(0, s, root);
else if (op == 1)
del(0, s, root);
else if (op == 2)
fout << cnt(0, s, root) << '\n';
else
fout << pref(0, s, root) << '\n';
}
return 0;
}