Pagini recente » Istoria paginii utilizator/negreanuvlad | Statisticile problemei Dragon Ball | Monitorul de evaluare | Cod sursa (job #1594543) | Cod sursa (job #1098981)
#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 *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->word;
return ;
}
del(T->son[A[i] - 'a'], i + 1);
--T->son[A[i] - 'a']->let;
if (T->son[A[i] - 'a']->let == 0) {
delete T->son[A[i] - 'a'];
T->son[A[i] - 'a'] = '\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();
}