Pagini recente » Cod sursa (job #2221786) | Cod sursa (job #475106) | Cod sursa (job #2311176) | Cod sursa (job #1478781) | Cod sursa (job #978647)
Cod sursa(job #978647)
#include<fstream>
#include<cstring>
#define DIM 2500000
#define DM 30
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int i,t,T,n,tip,L;
char s[DIM];
char c[DM];
struct Trie
{
int nr,nrfii;
Trie *fiu[30];
Trie()
{
nrfii=nr=0;
memset(fiu,0,sizeof(fiu));
}
};
Trie *r=new Trie;
void insert(Trie *nod,char *p)
{
if(!(*p)){
++nod->nr;
return ; }
if(nod->fiu[*p]==NULL)
{
nod->fiu[*p]=new Trie;
++nod->nrfii;
}
insert(nod->fiu[*p],p+1);
}
int erase(Trie *nod,char *p)
{
if(!(*p)){
--nod->nr; }
else
if(nod->fiu[*p]){
if(erase(nod->fiu[*p],p+1)){
nod->fiu[*p]=NULL;
--nod->nrfii; }
}
if(!nod->nrfii&&!nod->nr&&nod!=r){
delete nod;
return 1;
}
return 0;
}
int find(Trie *nod,char *p)
{
if(!(*p))
return nod->nr;
if(nod->fiu[*p])
return find(nod->fiu[*p],p+1);
return 0;
}
int prefix(Trie *nod,char *p)
{
++L;
if(nod->fiu[*p])
return prefix(nod->fiu[*p],p+1);
return L-1;
}
int main ()
{
f.get(s,DIM,EOF);
n=strlen(s);
for(i=0;i<n;++i)
{
tip=s[i]-'0';
i+=2;
t=-1;
while(s[i]!='\n'&&i<n)
c[++t]=s[i++]-'a'+1;
L=0;
c[++t]=0;
if(tip==0)
insert(r,c);
if(tip==1)
t=erase(r,c);
if(tip==2)
g<<find(r,c)<<"\n";
if(tip==3)
g<<prefix(r,c)<<"\n";
}
return 0;
}