Pagini recente » Cod sursa (job #122174) | Cod sursa (job #3224820) | Cod sursa (job #3225532) | Cod sursa (job #24159) | Cod sursa (job #3206160)
#include<fstream>
std::ifstream fin("trie.in");
std::ofstream fout("trie.out");
struct node{
int nrC=0;
int nrAp=0;
node *a[27];
node()
{
nrC=0;
nrAp=0;
for(int i=0; i<27; ++i)
a[i]=NULL;
}
}*rad=new node;
void inserare(node *t, char *pos)
{
if(*pos==0)
{
t->nrAp++;
return;
}
int i=*pos-'a';
if(!(t->a[i]))
{
t->a[i]=new node;
t->nrC++;
}
inserare(t->a[i], pos+1);
}
bool stergere(node *t, char *pos)
{
if(*pos==0)
{
t->nrAp--;
if(t->nrAp==0 && t->nrC==0 && t!=rad)
{
delete t;
return true;
}
return false;
}
int i=*pos-'a';
bool del=stergere(t->a[i], pos+1);
if(del)
{
t->a[i]=0;
t->nrC--;
if(t->nrAp==0 && t->nrC==0 && t!=rad && del)
{
delete t;
return true;
}
}
return false;
}
int ap(node *t, char *cuvant)
{
if(*cuvant==0)
return t->nrAp;
int i=*cuvant-'a';
if(t->a[i])
return ap(t->a[i], cuvant+1);
return 0;
}
int pref(node *t, char *cuvant, int nr)
{
if(*cuvant==0)
return nr;
int i=*cuvant-'a';
if(t->a[i]==0)
return nr;
return pref(t->a[i], cuvant+1, nr+1);
}
int main()
{
while(!fin.eof())
{
int task;
char s[25];
fin.getline(s, 25);
task=s[0];
if(task=='0')
inserare(rad, s+2);
else if(task=='1')
stergere(rad, s+2);
else if(task=='2')
fout<<ap(rad, s+2)<<'\n';
else if(task=='3')
fout<<pref(rad, s+2, 0)<<'\n';
}
return 0;
}