Pagini recente » Cod sursa (job #1285161) | Cod sursa (job #1617477) | Cod sursa (job #1497808) | Cod sursa (job #2351768) | Cod sursa (job #1458044)
#include <fstream>
#include <cstring>
using namespace std;
ofstream fout("trie.out");
ifstream fin("trie.in");
struct Trie
{
int cuvinte;
int prefixe;
Trie *fii[26];
Trie() {
cuvinte = prefixe = 0;
memset(fii, 0, sizeof(fii));
}
};
Trie *t = new Trie();
void inserare(char * cuv, Trie * nod)
{
nod -> prefixe++;
if(*cuv == 0) {
nod -> cuvinte++;
return;
}
if(nod -> fii[*cuv - 'a'] == 0)
nod -> fii[*cuv - 'a'] = new Trie();
inserare(cuv + 1, nod -> fii[*cuv - 'a']);
}
void stergere(char * cuv, Trie * nod)
{
nod -> prefixe--;
if(*cuv == 0) {
nod -> cuvinte--;
return;
}
stergere(cuv + 1, nod -> fii[*cuv - 'a']);
}
int aparitii(char * cuv, Trie * nod)
{
if(*cuv == 0) return nod -> cuvinte;
if(nod -> fii[*cuv - 'a'] == 0) return 0;
return aparitii(cuv + 1, nod -> fii[*cuv - 'a']);
}
int lungime_prefix(char * cuv, Trie * nod)
{
if(nod -> prefixe == 0) return 0;
if(*cuv == 0) return 1;
if(nod -> fii[*cuv - 'a'] == 0) return 1;
return 1 + lungime_prefix(cuv + 1, nod -> fii[*cuv - 'a']);
}
int main()
{
char cuvant[26];
int op = 0;
while(fin >> op) {
fin >> cuvant;
switch (op)
{
case 0: inserare(cuvant, t); break;
case 1: stergere(cuvant, t); break;
case 2: fout << aparitii(cuvant, t) << '\n'; break;
case 3: fout << max(lungime_prefix(cuvant, t) - 1, 0) << '\n'; break;
}
}
return 0;
}