Pagini recente » Cod sursa (job #2415456) | Cod sursa (job #1241981) | Cod sursa (job #2418239) | Cod sursa (job #1482712) | Cod sursa (job #1098752)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie {
Trie *son[26];
int c, s;
Trie() {
memset(son, '\0', sizeof(son));
c = s = 0;
}
};
Trie *T = new Trie;
int Q; char A[25];
inline void add(Trie *&T, int i) {
if (A[i] == '\0') {
++T->c;
return ;
}
if (!T->son[A[i] - 'a']) {
T->son[A[i] - 'a'] = new Trie;
++T->s;
}
add(T->son[A[i] - 'a'], i + 1);
}
bool fq;
inline void del(Trie *&T, int i) {
if (A[i] == '\0') {
if (T->s == 0 && T->c == 1) {
delete T;
T = '\0';
return ;
} else {
fq = true;
--T->c;
return ;
}
}
del(T->son[A[i] - 'a'], i + 1);
if (fq)
return ;
if (i > 1) {
if (T->s == 1) {
delete T;
T = '\0';
} else {
--T->s;
fq = true;
}
}
}
inline int nap(Trie *T, int i) {
if (A[i] == '\0')
return T->c;
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 - 1;
if (!T->son[A[i] - 'a'])
return i - 1;
return pre(T->son[A[i] - 'a'], i + 1);
}
int main() {
while (fin >> Q) {
fq = false;
fin >> (A + 1); A[strlen(A + 1) + 1] = '\0';
if (Q == 0)
add(T, 1);
else if (Q == 1)
del(T, 1);
else if (Q == 2)
fout << nap(T, 1) << '\n';
else
fout << pre(T, 1) << '\n';
}
fin.close();
fout.close();
}