Pagini recente » Cod sursa (job #758748) | Cod sursa (job #2012908) | Cod sursa (job #993064) | Cod sursa (job #2094163) | Cod sursa (job #1019436)
#include <fstream>
#include <cstring>
#include <cstdlib>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
int i, op, n;
char w[21];
struct nod {
int ap;
int erase_ap;
nod *next[26];
};
nod *root, *T;
void init(nod *&root) {
root = new nod;
root->ap = 0;
root->erase_ap = 0;
memset(root->next, 0, sizeof(root->next));
}
void insert(nod *root, char a[], int n) {
T = root;
for (int i = 0; i < n; ++i) {
if (T->next[a[i] - 'a'] == NULL)
init(T->next[a[i] - 'a']);
T = T->next[a[i] - 'a'];
++T->ap;
}
++T->erase_ap;
}
void erase(nod *T, int i) {
T = T->next[w[i] - 'a'];
if (i == n - 1) {
--T->erase_ap;
--T->ap;
if (T->erase_ap == 0 && T->ap == 0) {
delete T;
}
return;
}
erase(T, i + 1);
--T->ap;
if (T->ap == 0) {
delete T;
}
}
int query(nod *root, char a[], int n) {
T = root;
for (int i = 0; i < n; ++i) {
if (T->next[a[i] - 'a'] == NULL) return 0;
T = T->next[a[i] - 'a'];
}
return T->erase_ap;
}
int prefix (nod *root, char a[], int n) {
T = root;
for (int i = 0; i < n; ++i) {
if (T->next[a[i] - 'a'] == NULL)
return i;
T = T->next[a[i] - 'a'];
}
return n;
}
int main() {
init(root);
while (!fin.eof()) {
fin >> op;
fin >> w;
n = strlen(w);
if (!op)
insert(root, w, n);
if (op == 1)
erase(root, 0);
if (op == 2)
fout << query(root, w, n) << '\n';
if (op == 3)
fout << prefix(root, w, n) << '\n';
}
return 0;
}