Pagini recente » Cod sursa (job #2622714) | Cod sursa (job #1721381) | Cod sursa (job #483927) | Cod sursa (job #2910933) | Cod sursa (job #1700239)
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define Dragoste 4096
#define SIGMA 10
#define NIL -1
struct trie {
int count, numSons;
trie *sons[SIGMA];
trie() {
this -> count = 0;
this -> numSons = 0;
memset(this -> sons, NULL, sizeof(this -> sons));
}
};
trie *root;
char d[SIGMA + 1];
char buff[Dragoste];
int pos = Dragoste;
char getChar(FILE *f) {
if (pos == Dragoste) {
fread(buff, 1, Dragoste, f);
pos = 0;
}
return buff[pos++];
}
int freef(FILE *f) {
int result = 0;
char c;
do {
c = getChar(f);
} while (!isdigit(c));
do {
result = (result << 3) + (result << 1) + c - '0';
c = getChar(f);
} while (isdigit(c));
return result;
}
void insert(trie* &nod, int ptr) {
if (d[ptr] == '\0') {
nod -> count = 1;
return;
}
if (nod -> sons[d[ptr] - '0'] == NULL) {
nod -> sons[d[ptr] - '0'] = new trie;
nod -> numSons++;
}
insert(nod -> sons[d[ptr] - '0'], ptr + 1);
}
int erase(trie* &nod, int ptr) {
if (d[ptr] == '\0') {
nod -> count = 0;
} else if (erase(nod -> sons[d[ptr] - '0'], ptr + 1) == 1) {
nod -> sons[d[ptr] - '0'] = NULL;
nod -> numSons--;
}
if (nod != root && nod -> numSons == 0 && nod -> count == 0) {
delete nod;
return 1;
}
return 0;
}
int find(trie* &nod, int ptr) {
if (d[ptr] == '\0') {
return 1;
}
return nod -> sons[d[ptr] - '0'] == NULL ? 0 : find(nod -> sons[d[ptr] - '0'], ptr + 1);
}
int main(void) {
int size;
char c, task;
FILE *f = fopen("hashuri.in", "r");
freopen("hashuri.out", "w", stdout);
root = new trie;
//fprintf(stderr, "%d\n", root -> count);
//fprintf(stderr, "amin");
int N = freef(f);
while (N) {
task = getChar(f);
getChar(f);
size = 0;
c = getChar(f);
do {
d[size++] = c;
c = getChar(f);
} while (c != '\n');
d[size] = '\0';
// fprintf(stderr, "Operatie: %d -> %s\n", N, d);
if (task == '1') {
//fprintf(stderr, "ma %s\n", d);
insert(root, 0);
// fprintf(stderr, "Adauga\n");
// fprintf(stderr, "1");
} else if (task == '2') {
//fprintf(stderr, "sterge\n");
if (find(root, 0)) {
// fprintf(stderr, "Nu intra");
erase(root, 0);
}
// fprintf(stderr, "2");
} else if (task == '3') {
fprintf(stdout, "%d\n", find(root, 0));
//fprintf(stderr, "3");
}
N--;
}
fclose(f);
fclose(stdout);
/// Multumim Doamne!
puts("Doamne ajuta!");
return 0;
}