Pagini recente » Cod sursa (job #2585478) | Cod sursa (job #310672) | Cod sursa (job #2500080) | Cod sursa (job #1126759) | Cod sursa (job #1803483)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin ("trie.in");
ofstream fout ("trie.out");
struct Trie {
int nr, nrfii;
Trie *fiu[27];
Trie() {
nrfii = nr = 0;
memset(fiu, 0, sizeof(fiu));
}
};
const int N = 2500000;
int i, t, T, n, tip, L;
char s[N], c[30];
Trie *r=new Trie;
void baga(Trie *nod, char *p) {
if (!(*p)) {
++nod -> nr;
return;
}
if (nod -> fiu[*p] == NULL) {
nod -> fiu[*p] = new Trie;
++nod -> nrfii;
}
baga(nod -> fiu[*p], p + 1);
}
int taie(Trie *nod, char *p) {
if (!(*p)) {
--nod -> nr;
} else if (nod -> fiu[*p]) {
if (taie(nod -> fiu[*p], p + 1)) {
nod -> fiu[*p] = NULL;
--nod->nrfii;
}
}
if (!nod -> nrfii && !nod -> nr && nod != r) {
delete nod;
return 1;
}
return 0;
}
int cauta(Trie *nod,char *p) {
if (!(*p)) {
return nod -> nr;
}
if (nod -> fiu[*p]) {
return cauta(nod -> fiu[*p], p + 1);
}
return 0;
}
int prefix(Trie *nod,char *p) {
++L;
if (nod -> fiu[*p]) {
return prefix(nod -> fiu[*p], p + 1);
}
return L - 1;
}
int main () {
fin.get(s, N, EOF);
n = strlen(s);
for (i=0; i < n; ++i) {
tip = s[i] - '0';
i += 2;
t =- 1;
while (s[i] != '\n' && i < n) {
c[++t] = s[i++] - 'a' + 1;
}
L = 0;
c[++t] = 0;
if (tip == 0) {
baga(r, c);
}else if (tip == 1) {
t = taie(r, c);
} else if (tip == 2) {
fout << cauta(r,c) << "\n";
} else {
fout << prefix(r,c) << "\n";
}
}
return 0;
}