// 0 w - adauga o aparitie a cuvantului w in lista
// 1 w - sterge o aparitie a cuvantului w in lista
// 2 w - tipareste numarul de aparitii ale cuv. w in lista
// 3 w - tipareste lungimea c.m.l. prefix comun lui w cu oricuarev. din lista
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
#define nmax 21
ifstream in("trie.in");
ofstream out("trie.out");
int tip,Max;
char w[nmax];
bool ok;
typedef struct varf {
int prefix;
int nra = 0; // nr aparitii
struct varf *desc[26];
}VARF, *TRIE;
TRIE T;
void init(TRIE &T) {
int i;
T = new VARF;
for (i=0; i<26; i++)
T->desc[i] = NULL;
}
void adauga(TRIE &T, char C[], int p, long siz, int prev) {
int ind;
if (C[p] == '\0'){
(T->nra)++;
return;
}
if (T == NULL)
init(T);
ind = int(C[p]-'a');
if (T->desc[ind] != NULL) {
T->desc[ind]->prefix = prev + 1;
adauga(T->desc[ind], C, p+1, siz, prev + 1);
} else {
init(T->desc[ind]);
T->desc[ind]->prefix = prev + 1;
adauga(T->desc[ind], C, p+1, siz, prev + 1);
}
}
void sterge(TRIE &T, char C[], int p, long siz) {
int ind;
if (C[p] == '\0'){
T->nra--;
if (T->nra == 0) {
delete(T);
T = NULL;
}
return;
}
ind = int(C[p]-'a');
if (T->desc[ind] != NULL){
sterge(T->desc[ind], C, p+1, siz);
}
}
void nraparitii(TRIE T, char C[], int p, long siz) {
int ind;
ind = int(C[p]-'a');
if (T->desc[ind] != NULL){
if (p == siz - 1)
out << T->desc[ind]->nra << "\n";
else
nraparitii(T->desc[ind], C, p+1, siz);
}
}
void nrPrefix(TRIE T, char C[], int p, long siz) {
int ind;
if (C[p] == '\0')
return;
ind = int(C[p]-'a');
if (T->desc[ind] != NULL) {
Max = max(Max, T->desc[ind]->prefix);
nrPrefix(T->desc[ind], C, p+1, siz);
}
}
void scrie(TRIE T) {
int i;
if (T == NULL)
return;
for (i=0; i<26; i++)
if (T->desc[i] != NULL)
cout <<T->desc[i]->prefix;
cout << "\n";
for (i=0; i<26; i++)
if (T->desc[i] != NULL)
scrie(T->desc[i]);
}
int main() {
while (!in.eof()) {
in >> tip >> w;
if (tip == 0) {
adauga(T, w, 0, strlen(w), 0);
} else if (tip == 1) {
sterge(T, w, 0, strlen(w));
} else if (tip == 2) {
nraparitii(T, w, 0, strlen(w));
} else {
Max = 0;
nrPrefix(T, w, 0, strlen(w));
out << Max << "\n";
}
}
in.close();
out.close();
return 0;
}