Pagini recente » Cod sursa (job #770934) | Cod sursa (job #3041265) | Cod sursa (job #2578925) | Cod sursa (job #1036541) | Cod sursa (job #3005585)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream f ("trie.in");
ofstream g ("trie.out");
struct nod{
int cuvinte,prefixe;
nod *copii[30];
nod()
{
cuvinte = 0;
prefixe = 0;
for(int i = 0;i<30;i++)
copii[i] =0 ;
}
}*rad;
void adaugare(nod *curent,int indice,int l,char *cuv)
{
curent->prefixe++;
if(indice==l)
{
curent->cuvinte++;
return;
}
if(curent->copii[cuv[indice]-'a']==NULL)
{
curent->copii[cuv[indice]-'a'] = new nod;
}
adaugare(curent->copii[cuv[indice]-'a'],indice+1,l,cuv);
}
void stergere(nod *curent,int indice,int l,char *cuv)
{
curent->prefixe--;
if(indice==l)
{
curent->cuvinte--;
return;
}
stergere(curent->copii[cuv[indice]-'a'],indice+1,l,cuv);
}
int numarare(nod *curent,int indice,int l,char *cuv)
{
if(indice==l)
{
return curent->cuvinte;
}
if(curent->copii[cuv[indice]-'a']== 0 || curent->copii[cuv[indice]-'a']->prefixe== 0)
return 0;
return numarare(curent->copii[cuv[indice]-'a'],indice+1,l,cuv);
}
int prefix(nod *curent ,int indice,int l,char *cuv)
{
if(indice==l)
return l;
if(curent->copii[cuv[indice]-'a']== 0 || curent->copii[cuv[indice]-'a']->prefixe== 0)
return indice;
return prefix(curent->copii[cuv[indice]-'a'],indice+1,l,cuv);
}
int main()
{
int c;
nod *rad = new nod;
char cuv[30];
while(f >> c>>cuv)
{
if(c==0)
adaugare(rad,0,strlen(cuv),cuv);
else
if(c==1)
stergere(rad,0,strlen(cuv),cuv);
else
if(c==2)
g << numarare(rad,0,strlen(cuv),cuv)<< '\n';
else
if(c==3)
g << prefix(rad,0,strlen(cuv),cuv)<< '\n';
}
}