Pagini recente » Cod sursa (job #523804) | Cod sursa (job #1319600) | Cod sursa (job #239186) | Cod sursa (job #2148236) | Cod sursa (job #2051059)
#include <fstream>
using namespace std;
struct TRIE
{
int nrc,nre;
TRIE *E[30];
TRIE()
{
nrc=nre=0;
for(int i=0;i<26;i++)
E[i]=0;
}
};
ifstream fi("trie.in");
ofstream fo("trie.out");
int tip;
char command[30];
TRIE *T=new TRIE;
void adauga(TRIE *nod,char C[])
{
if(!C[0])
{
nod->nrc++;
return;
}
int x=C[0]-'a';
if(nod->E[x]==0)
{
nod->nre++;
nod->E[x]=new TRIE;
}
adauga(nod->E[x],C+1);
}
int sterge(TRIE *nod,char C[])
{
if(!C[0])
nod->nrc--;
else if(sterge(nod->E[C[0]-'a'],C+1))
{
nod->E[C[0]-'a']=0;
nod->nre--;
}
if(nod->nrc==0&&nod->nre==0&&nod!=T)
{
delete nod;
return 1;
}
return 0;
}
int nraparitii(TRIE *nod,char C[])
{
if(!C[0])
return nod->nrc;
int x=C[0]-'a';
if(nod->E[x])
return nraparitii(nod->E[x],C+1);
else
return 0;
}
int nrprefixe(TRIE *nod,char C[],int k)
{
if(!C[0])
return k;
if(!nod->E[C[0]-'a'])
return k;
return nrprefixe(nod->E[C[0]-'a'],C+1,k+1);
}
int main()
{
while(fi>>tip)
{
fi>>command;
if(tip==0)
adauga(T,command);
else if(tip==1)
sterge(T,command);
else if(tip==2)
fo<<nraparitii(T,command)<<"\n";
else
fo<<nrprefixe(T,command,0)<<"\n";
}
fi.close();
fo.close();
}