Pagini recente » Cod sursa (job #2020676) | Cod sursa (job #3233944) | Cod sursa (job #1562718) | Cod sursa (job #373213) | Cod sursa (job #1146827)
#include <fstream>
#include <string.h>
using namespace std;
ifstream cin("trie.in");
ofstream cout("trie.out");
int x;
char v[30];
struct nod
{
int nr,fii;
nod *urm[30];
nod()
{
int i;
nr=fii=0;
for(i=0; i<=26; i++)
urm[i]=NULL;
}
}*rad;
void baga(nod *p)
{
int i, lit;
for(i=0; v[i]!='\0'; i++)
{
lit=v[i]-'a';
if(p->urm[lit]==NULL)
{
p->urm[lit]=new nod();
p->fii++;
}
p=p->urm[lit];
}
p->nr++;
}
bool sterge(nod *p, int i)
{
int lit;
if(v[i]=='\0')
p->nr--;
else
{
lit=v[i]-'a';
if(sterge(p->urm[lit],i+1))
{
--p->fii;
p->urm[lit]=NULL;
}
}
if(p->fii==0 && p->nr==0 && p!=rad)
{
delete p;
return true;
}
return false;
}
int nrap(nod *p)
{
int lit,i;
for(i=0; v[i]!='\0'; i++)
{
lit=v[i]-'a';
if(p->urm[lit]==NULL) return 0;
else p=p->urm[lit];
}
return p->nr;
}
int nrprefix(nod *p)
{
int lit,i;
for(i=0; v[i]!='\0'; i++ )
{
lit=v[i]-'a';
if(p->urm[lit]==NULL) return i;
else p=p->urm[lit];
}
return strlen(v);
}
int main()
{
rad = new nod;
while(cin>>x>>v)
{
if(x==0)
baga(rad);
if(x==1)
sterge(rad,0);
if(x==2)
cout<<nrap(rad)<<"\n";
if(x==3)
cout<<nrprefix(rad)<<"\n";
}
}