Pagini recente » Cod sursa (job #960493) | Cod sursa (job #2987756) | Cod sursa (job #585316) | Cod sursa (job #2320055) | Cod sursa (job #2572659)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
const int ALPHA = 26;
const int MAX_N = 2e1 + 5;
struct Trie {
int cnt, end_string;
Trie *child[ALPHA];
Trie() {
cnt = end_string = 0;
for (int i = 0; i < ALPHA; ++i) {
child[i] = NULL;
}
}
};
char s[MAX_N];
Trie *root;
void trie_insert(char *s) {
Trie *p;
p = root;
for (int i = 0; s[i] > 0; ++i) {
if (p -> child[s[i] - 'a'] == NULL) {
p -> child[s[i] - 'a'] = new Trie;
}
p = p -> child[s[i] - 'a'];
++p -> cnt;
}
++p -> end_string;
}
void trie_delete(char *s, Trie *node) {
if (s[0] == '\0') {
--node -> end_string;
return;
}
trie_delete(s + 1, node -> child[s[0] - 'a']);
--node -> child[s[0] - 'a'] -> cnt;
if (node -> child[s[0] - 'a'] -> cnt == 0) {
delete node -> child[s[0] - 'a'];
node -> child[s[0] - 'a'] = NULL;
}
}
int count_trie_word(char *s) {
Trie *p;
p = root;
for (int i = 0; s[i] > 0; ++i) {
if (p -> child[s[i] - 'a'] == NULL) {
return 0;
}
p = p -> child[s[i] - 'a'];
}
return p -> end_string;
}
int long_trie_pref(char *s) {
Trie *p;
p = root;
for (int i = 0; s[i] > 0; ++i) {
if (p -> child[s[i] - 'a'] == NULL) {
return i;
}
p = p -> child[s[i] - 'a'];
}
return p -> cnt;
}
int main() {
int op;
root = new Trie;
while (fin >> op) {
fin >> s;
if (op == 0) {
trie_insert(s);
} else if (op == 1) {
trie_delete(s, root);
} else if (op == 2) {
fout << count_trie_word(s) << "\n";
} else if (op == 3) {
fout << long_trie_pref(s) << "\n";
}
}
return 0;
}