Pagini recente » Cod sursa (job #2319606) | Cod sursa (job #2319626) | Cod sursa (job #2806911) | Cod sursa (job #733765) | Cod sursa (job #2518083)
#include <stdio.h>
#include <string.h>
#include <fstream>
using namespace std;
ifstream fin("trie.in");
FILE *fout = fopen("trie.out", "w");
char sir[25];
int op,lg;
struct trie
{
int nrfii; int nrcuv; trie *fii[26];
trie()
{
nrfii = nrcuv = 0;
memset(fii, 0, sizeof(fii));
}
} *rad = new trie;
void inserare(int poz, trie *nod)
{
if(poz == lg)
{
nod->nrcuv++;
return;
}
if(nod->fii[sir[poz]-'a'] == 0)
{
nod->nrfii++;
nod->fii[sir[poz]-'a'] = new trie;
}
inserare(poz+1, nod->fii[sir[poz]-'a']);
}
bool eliminare(int poz, trie *nod)
{
if(poz == lg)
nod->nrcuv--;
else
{
bool rasp = eliminare(poz+1, nod->fii[sir[poz]-'a']);
if(rasp == 1)
{
nod->nrfii--;
nod->fii[sir[poz]-'a'] = 0;
}
}
if(nod->nrcuv == 0 and nod->nrfii == 0 and nod!=rad)
{
delete nod;
return 1;
}
return 0;
}
void tiparire(int poz, trie *nod)
{
if(poz == lg)
{
fprintf(fout, "%d\n", nod->nrcuv);
return;
}
if(nod->fii[sir[poz]-'a'])
tiparire(poz+1, nod->fii[sir[poz]-'a']);
else
fprintf(fout, "0\n");
}
int prefix(int poz, trie *nod)
{
if(poz == lg)
return lg;
if(nod->fii[sir[poz]-'a'])
return prefix(poz+1, nod->fii[sir[poz]-'a']);
return poz;
}
int main()
{
while(fin >> op)
{
fin.get();
fin.get(sir, 22, '\n');
fin.get();
lg = strlen(sir);
if(op == 0)
inserare(0, rad);
else
if(op == 1)
eliminare(0, rad);
else
if(op == 2)
tiparire(0, rad);
else
fprintf(fout, "%d\n", prefix(0, rad));
}
fin.close();
fclose(fout);
return 0;
}