Pagini recente » Monitorul de evaluare | cuantictiori | cuantictiori | cuantictiori | Cod sursa (job #1222182)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
#define nmax 26
ifstream in("trie.in");
ofstream out("trie.out");
typedef struct varf {
int prefix;
int nrAparitii;
struct varf *desc[26];
} VARF, *TRIE;
int tip,Max;
char C[nmax];
TRIE T;
bool ok;
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) {
int ind;
if (T == NULL)
init(T);
T->prefix = p;
if (C[p] == '\0') {
T->nrAparitii++;
return;
}
ind = int(C[p]-'a');
if (T->desc[ind] != NULL)
adauga(T->desc[ind], C, p+1);
else
init(T->desc[ind]),
adauga(T->desc[ind], C, p+1);
}
void sterge(TRIE &T, char C[], int p) {
int ind,i,cnt;
if (C[p] == '\0') {
T->nrAparitii--;
if (T->nrAparitii == 0){
ok = true;
cnt=0;
for (i=0; i<26; i++)
if (T->desc[i] != NULL)
cnt++;
if (cnt == 0) {
delete(T);
T = NULL;
}
}
return;
}
ind = int(C[p]-'a');
if (T->desc[ind] != NULL)
sterge(T->desc[ind], C, p+1);
if (ok) {
cnt=0;
for (i=0; i<26; i++)
if (T->desc[i] != NULL)
cnt++;
if (cnt == 0 && T->nrAparitii == 0) {
delete(T);
T = NULL;
}
}
}
void aparitii(TRIE &T, char C[], int p) {
int ind;
if (C[p] == '\0'){
ok = true;
out << T->nrAparitii << "\n";
return;
}
ind = int(C[p]-'a');
if (T->desc[ind] != NULL)
aparitii(T->desc[ind], C, p+1);
}
void lungime(TRIE &T, char C[], int p) {
int ind;
Max = max(Max, T->prefix);
if (C[p] == '\0') {
return;
}
ind = int(C[p]-'a');
if (T->desc[ind] != NULL)
lungime(T->desc[ind], C, p+1);
}
void sterge_all(TRIE &T) {
int i, cnt = 0;
if (T == NULL)
return;
for (i=0; i<26; i++)
if (T->desc[i] != NULL)
cnt++;
if (cnt == 0) {
delete(T);
T = NULL;
} else {
for (i=0; i<26; i++)
if (T->desc[i] != NULL)
sterge_all(T->desc[i]);
delete(T);
T = NULL;
}
}
int main() {
init(T);
while (in >> tip >> C) {
in.get();
switch(tip){
case 0:
adauga(T, C, 0);
break;
case 1:
ok = false;
sterge(T, C, 0);
break;
case 2:
ok = false;
aparitii(T, C, 0);
if (!ok)
out << 0 << "\n";
break;
default:
Max = 0;
lungime(T, C, 0);
out << Max << "\n";
break;
}
memset(C, '\0', 26);
}
sterge_all(T);
return 0;
}