Pagini recente » Cod sursa (job #53648) | Cod sursa (job #624719) | Cod sursa (job #770933) | Cod sursa (job #2170136) | Cod sursa (job #590328)
Cod sursa(job #590328)
# include <fstream>
# include <cstring>
using namespace std;
ifstream f ("trie.in");
ofstream g ("trie.out");
int n,ok,i,x;
char c[30];
struct nod
{
int info;
nod *q[26];
nod ()
{
info=0;
int i;
for (i=0;i<26;i++)
q[i]=0;
}
}*p,*v,*w;
void adauga (nod *p,char c[30])
{
int i,n;
n=strlen (c);
i=0;
while (i<n)
if (p->q[c[i]-97])
{
p=p->q[c[i]-97];
i++;
}
else
break;
while (i<n)
{
w=new nod;
p->q[c[i]-97]=w;
p=w;
i++;
}
p->info++;
}
int verif (nod *p)
{
int i;
for (i=0;i<26;i++)
if (p->q[i])
return 1;
return 0;
}
void sterge (nod *p,char c[30],int i)
{
if (i<n)
sterge (p->q[c[i]-97],c,i+1);
else
{
p->info--;
if (p->info>0)
ok=0;
}
if (ok==1 && i!=n)
p->q[c[i]-97]=0;
if (p->info>0)
ok=0;
if (verif (p)==1)
ok=0;
if (ok==1)
if (p!=v)
delete p;
}
int nrap (nod *p,char c[30])
{
int i,n;
n=strlen (c);
i=0;
while (i<n)
if (p->q[c[i]-97])
{
p=p->q[c[i]-97];
i++;
}
else
break;
if (i==n)
return p->info;
else
return 0;
}
int prefix (nod *p,char c[30])
{
int i,n;
n=strlen (c);
i=0;
while (i<n)
if (p->q[c[i]-97])
{
p=p->q[c[i]-97];
i++;
}
else
break;
return i;
}
int main ()
{
v=new nod;
while (f>>x)
{
f>>c;
if (x==0)
adauga (v,c);
if (x==1)
{
ok=1;
n=strlen (c);
sterge (v,c,0);
}
if (x==2)
g<<nrap (v,c)<<"\n";
if (x==3)
g<<prefix (v,c)<<"\n";
}
return 0;
}