Pagini recente » Cod sursa (job #2464675) | Cod sursa (job #3265071) | Cod sursa (job #2185355) | Cod sursa (job #1289251) | Cod sursa (job #1098994)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie {
Trie *son[26];
int let, word;
Trie() {
memset(son, '\0', sizeof(son));
let = word = 0;
}
};
Trie *T = new Trie;
int Q; char A[30];
inline void add(Trie *&T, int i) {
++T->let;
if (A[i] == '\0') {
++T->word;
return ;
}
if (!T->son[A[i] - 'a'])
T->son[A[i] - 'a'] = new Trie;
add(T->son[A[i] - 'a'], i + 1);
}
inline void del(Trie *&T, int i) {
if (A[i] == '\0') {
--T->let; --T->word;
if (T->let == 0) {
delete T;
T = '\0';
}
return ;
}
del(T->son[A[i] - 'a'], i + 1);
--T->let;
if (T->let == 0 && i) {
delete T;
T = '\0';
}
}
inline int nap(Trie *T, int i) {
if (A[i] == '\0')
return T->word;
if (!T->son[A[i] - 'a'])
return 0;
return nap(T->son[A[i] - 'a'], i + 1);
}
inline int pre(Trie *T, int i) {
if (A[i] == '\0')
return i;
if (!T->son[A[i] - 'a'])
return i;
return pre(T->son[A[i] - 'a'], i + 1);
}
int main() {
while (fin >> Q) {
fin >> A;
if (Q == 0)
add(T, 0);
else if (Q == 1)
del(T, 0);
else if (Q == 2)
fout << nap(T, 0) << '\n';
else
fout << pre(T, 0) << '\n';
}
fin.close();
fout.close();
}