Pagini recente » Cod sursa (job #3139744) | Cod sursa (job #747664) | Cod sursa (job #1852318) | Cod sursa (job #361428) | Cod sursa (job #1335764)
#include<fstream>
#include<cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int op;
char s[22];
struct trie{
int nr,nrf;
trie *fii[26];
trie()
{
nr=nrf=0;
memset(fii,0,sizeof(fii));
}
};
trie *t =new trie;
void insereaza(trie *x,char *p)
{
if(*p==0)
{
++x->nr;
return ;
}
if(!(x->fii[*p-'a']))
{
++x->nrf;
x->fii[*p-'a']=new trie;
}
insereaza(x->fii[*p-'a'],p+1);
}
int sterge(trie *x,char *p)
{
if(*p==0)
{
--x->nr;
}
else
if(sterge(x->fii[*p-'a'],p+1))
{
--x->nrf;
x->fii[*p-'a']=0;
}
if(x->nrf==0&&x->nr==0&&t!=x)
{
delete x;
return 1;
}
return 0;
}
int egale(trie *x,char *p)
{
if(*p==0)
{
return x->nr;
}
else
if(x->fii[*p-'a'])
{
return egale(x->fii[*p-'a'],p+1);
}
return 0;
}
int prefix(trie *x,char *p,int l)
{
if(*p==0||x->fii[*p-'a']==0)
{
return l;
}
return prefix(x->fii[*p-'a'],p+1,l+1);
}
int main()
{
while(f>>op)
{
f>>s;
if(op==0)
{
insereaza(t,s);
}
else
if(op==1)
{
sterge(t,s);
}
else
if(op==2)
{
g<<egale(t,s)<<'\n';
}
else
if(op==3)
{
g<<prefix(t,s,0)<<'\n';
}
}
return 0;
}