Pagini recente » Cod sursa (job #2834909) | Cod sursa (job #2597658) | Cod sursa (job #3159619) | Cod sursa (job #1607941) | Cod sursa (job #2031931)
#include <fstream>
#include <cstring>
using namespace std;
ifstream f ("trie.in");
ofstream g ("trie.out");
const int Dim = 2e5;
char s[ Dim ];
int type;
struct Trie {
int nrf, cnt;
Trie *fii[ 26 ];
Trie () {
cnt = nrf = 0;
memset (fii, 0, sizeof (fii));
}
};
Trie *Root = new Trie;
void adauga (Trie *node, char *s) {
if (*s == '\0') {
node -> cnt++;
return;
}
int ch = *s - 'a';
if (node -> fii[ ch ] == NULL) {
node -> fii[ ch ] = new Trie;
node -> nrf ++;
}
adauga (node -> fii[ ch ], s + 1);
}
bool scoate (Trie *node, char *s) {
int ch = *s - 'a';
if (*s == '\0') {
node -> cnt --;
}
else {
if (scoate (node -> fii[ ch ], s + 1)) {
node -> fii[ ch ] = NULL;
node -> nrf --;
}
}
if (node -> nrf == 0 && node -> cnt == 0 && node != Root) {
delete node;
return 1;
}
return 0;
}
int nrap (Trie *node, char *s) {
if (*s == '\0') {
return node -> cnt;
}
int ch = *s - 'a';
if (node -> fii[ ch ] != NULL) {
return nrap (node -> fii[ ch ], s + 1);
}
return 0;
}
int prefix (Trie *node, char *s, int lg) {
if (*s == '\0') {
return lg;
}
char ch = *s - 'a';
if (node -> fii[ ch ] != NULL) {
return prefix (node -> fii[ ch ], s + 1, lg + 1);
}
return lg;
}
int main() {
while (f >> type) {
f >> s;
if (type == 0) {
adauga (Root, s);
}
if (type == 1) {
scoate (Root, s);
}
if (type == 2) {
g << nrap (Root, s) << '\n';
}
if (type == 3) {
g << prefix (Root, s, 0) << '\n';
}
}
return 0;
}