Pagini recente » Cod sursa (job #592328) | Cod sursa (job #2624042) | Cod sursa (job #3260189) | Cod sursa (job #1785554) | Cod sursa (job #1017495)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
int i, n, N;
int op;
char w[21];
struct nod {
int ap, nrap;
nod *next[26];
};
nod *root;
nod *T;
void init(nod *&root) {
root = new nod;
root->ap = 0;
root->nrap = 0;
memset(root->next, 0, sizeof(root->next));
}
void insert(nod *root, char a[], int n) {
for (int i = 0; i < n; ++i) {
++root->ap;
if (root->next[a[i] - 'a'] == NULL)
init(root->next[a[i] - 'a']);
root = root->next[a[i] - 'a'];
}
root->nrap++;
root->ap++;
}
void erase(int i, nod *&root){
if (i == n) {
if (root->ap == 1) {
delete root;
root = NULL;
}
else
root->nrap--,
root->ap--;
return;
}
erase(i + 1, root->next[w[i] - 'a']);
if (root->ap == 1) {
delete root;
root = NULL;
}
else
--root->ap;
}
int prefix (nod *root, char a[], int n) {
for (int i = 0; i < n; ++i) {
if (root->next[a[i] - 'a'] == NULL) return i;
root = root->next[a[i] - 'a'];
}
return n;
}
int nrAparitii(nod *root, char a[], int n) {
for (int i = 0; i < n; ++i) {
if (root->next[a[i] - 'a'] == NULL)
return 0;
root = root->next[a[i] - 'a'];
}
return root->nrap;
}
int main() {
init(root);
while (!fin.eof()) {
if (!(fin >> op))
break;
fin >> w;
n = strlen(w);
if (!op) {
insert(root, w, n);
continue;
}
if (op == 1) {
erase(0, root);
continue;
}
if (op == 2) {
printf ("%d\n", nrAparitii(root, w, n));
continue;
}
if (op == 3) {
printf ("%d\n", prefix(root, w, n));
continue;
}
}
return 0;
}