Pagini recente » Cod sursa (job #2042059) | Cod sursa (job #1860196) | Cod sursa (job #3170475) | Cod sursa (job #1121886) | Cod sursa (job #2870175)
#include <fstream>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
#define SIRMAX 25
struct nod_trie {
int ap_pre = 0;
int ap_cuv = 0;
nod_trie *copii[26];
} *rad;
char sir[SIRMAX];
int nrlsir;
void adaugare(nod_trie *&nod, int pozcur) {
if (nod == nullptr)
nod = new nod_trie;
nod->ap_pre++;
if (pozcur == nrlsir)
nod->ap_cuv++;
else
adaugare(nod->copii[sir[pozcur] - 'a'], pozcur + 1);
}
void eliminare(nod_trie *&nod, int pozcur) {
nod->ap_pre--;
if (pozcur == nrlsir)
nod->ap_cuv--;
else
eliminare(nod->copii[sir[pozcur] - 'a'], pozcur + 1);
}
int aparitii_cuv(nod_trie *&nod, int pozcur) {
if (nod == nullptr || nod->ap_pre == 0)
return 0;
if (pozcur == nrlsir)
return nod->ap_cuv;
return aparitii_cuv(nod->copii[sir[pozcur] - 'a'], pozcur + 1);
}
int lungime_prefix(nod_trie *&nod, int pozcur) {
if (nod == nullptr || nod->ap_pre == 0)
return pozcur - 1;
if (pozcur == nrlsir)
return nrlsir;
return lungime_prefix(nod->copii[sir[pozcur] - 'a'], pozcur + 1);
}
int main() {
int cer;
while (f >> cer >> sir) {
nrlsir = strlen(sir);
if (cer == 0)
adaugare(rad, 0);
else if (cer == 1)
eliminare(rad, 0);
else if (cer == 2)
g << aparitii_cuv(rad, 0) << '\n';
else if (cer == 3)
g << lungime_prefix(rad, 0) << '\n';
}
return 0;
}