Pagini recente » Cod sursa (job #2931150) | Cod sursa (job #3123830) | Cod sursa (job #522394) | Cod sursa (job #729658) | Cod sursa (job #2589082)
#include <fstream>
#include <cstring>
using namespace std;
ifstream inf("trie.in");
ofstream outf("trie.out");
const int SIGMA = 26;
struct Trie {
int data;
int nrfii;
Trie *fiu[SIGMA];
Trie() {
data = 0;
nrfii = 0;
memset(fiu, 0, sizeof(fiu));
}
};
Trie* T = new Trie;
void add(Trie *t, char* s) {
while(*s != 0) {
if(t->fiu[*s - 'a'] == 0) {
t->fiu[*s - 'a'] = new Trie;
t->nrfii++;
}
t = t->fiu[*s - 'a'];
s++;
}
t->data++;
}
bool del(Trie *t, char* s) {
if(*s == 0) {
t->data--;
}
else if(del(t->fiu[*s - 'a'], s + 1)) {
t->fiu[*s - 'a'] = 0;
t->nrfii--;
}
if(t->data == 0 && t->nrfii == 0 && t != T) {
delete t;
return true;
}
return false;
}
char cuvt[21];
void afis(Trie* t, int k = 0) {
for(int i = 0; i < t->data; i++) {
outf << cuvt << '\n';
}
for(int i = 0; i < SIGMA; i++) {
if(t->fiu[i]) {
cuvt[k] = i + 'a';
afis(t->fiu[i], k + 1);
cuvt[k] = 0;
}
}
}
void afisRAW(Trie* t) {
outf << t->data << '\n';
for(int i = 0; i < SIGMA; i++) {
if(t->fiu[i]) {
outf << (char)(i + 'a') << ' ';
afisRAW(t->fiu[i]);
}
}
outf << "back \n";
}
char cuv[21];
int getAp(Trie* t, char* s) {
while(*s != 0) {
if(t->fiu[*s - 'a'] == 0) {
return 0;
}
t = t->fiu[*s - 'a'];
s++;
}
return t->data;
}
int getPref(Trie *t, char *s) {
int k = 0;
while(*s != 0 && t->fiu[*s - 'a'] != 0) {
t = t->fiu[*s - 'a'];
s++;
k++;
}
return k;
}
int main() {
int x;
while(inf >> x >> cuv) {
if(x == 0) {
add(T, cuv);
}
else if(x == 1) {
del(T, cuv);
}
else if(x == 2) {
outf << getAp(T, cuv) << '\n';
}
else if(x == 3) {
outf << getPref(T, cuv) << '\n';
}
}
return 0;
}