Pagini recente » Cod sursa (job #2677268) | Cod sursa (job #421384) | Cod sursa (job #1964784) | Solutii Summer Challenge, Runda 2 | Cod sursa (job #2553637)
#include <fstream>
#include <iostream>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct nod{
int nf,nrcop;
nod *urm[25]={0};
};
nod *radacina=new nod;
char s[25];
int cerinta,l,lungime;
void adaugare(nod *&p,int poz)
{
if(l==poz)
{
p->nf++;
return;
}
if(p->urm[s[poz]-'a']==0)
{
p->urm[s[poz]-'a']=new nod;
}
p->urm[s[poz]-'a']->nrcop++;
adaugare(p->urm[s[poz]-'a'], poz+1);
}
void stergere(nod *&p,int poz)
{
if(poz==l)
{
p->nf--;
if(p->nf==0 && p->nrcop==0)
{
p=0;
delete p;
}
return;
}
p->urm[s[poz]-'a']->nrcop--;
stergere(p->urm[s[poz]-'a'], poz+1);
if(p->nrcop==0 && p->nf==0 && poz!=0)
{
p=0;
delete p;
}
}
int aparitii(nod *p,int poz)
{
if(poz==l)
{
return p->nf;
}
if(p->urm[s[poz]-'a'])
return aparitii(p->urm[s[poz]-'a'], poz+1);
return 0;
}
int prefix(nod *p,int poz,int k)
{
if(poz==l)
return l;
if(!p->urm[s[poz]-'a'] || p->urm[s[poz]-'a']->nrcop== 0)
return k;
return prefix(p->urm[s[poz]-'a'], poz+1, k+1);
}
int main( ) {
while(fin>>cerinta>>s)
{
l=strlen(s);
if(cerinta==0)
{
adaugare(radacina, 0);
}
else
if(cerinta==1)
{
stergere(radacina, 0);
}
else
if(cerinta==2)
{
fout<< aparitii(radacina, 0)<<"\n";
}
else
if(cerinta==3)
{
fout<<prefix(radacina, 0,0)<<"\n";
}
}
return 0;
}