Pagini recente » Cod sursa (job #49346) | Cod sursa (job #520263) | Cod sursa (job #602321) | Cod sursa (job #338854) | Cod sursa (job #572477)
Cod sursa(job #572477)
#include <cstdio>
#include <cstring>
#define MaxN 100002
#define MaxL 26
#define infile "trie.in"
#define outfile "trie.out"
struct Trie{
int nc,nr;
Trie *fiu[MaxL];
Trie()
{
nc=nr=0;
memset(fiu,0,sizeof(fiu));
}
} *T=new Trie;
char s[MaxL];
void add(Trie *q,char s[])
{
if(s[0]=='\n')
{
q->nr++;
return;
}
if(!q->fiu[*s-'a'])
{
q->nc++;
q->fiu[*s-'a']=new Trie;
}
add(q->fiu[*s-'a'],s+1);
}
int del(Trie *q,char s[])
{
if(s[0]=='\n')
q->nr--;
else
if(del(q->fiu[*s-'a'],s+1))
{
q->fiu[*s-'a']=0;
q->nc--;
}
if(q->nr==0 && q->nc==0 && q!=T)
{
delete q;
return 1;
}
return 0;
}
int aparitii(Trie *q,char s[])
{
if(s[0]=='\n')
return q->nr;
if(q->fiu[*s-'a'])
return aparitii(q->fiu[*s-'a'],s+1);
return 0;
}
int prefix(Trie *q,char s[],int n)
{
if(s[0]=='\n') return n;
if(!q->fiu[*s-'a']) return n;
Trie *w=q->fiu[*s-'a'];
return prefix(w,s+1,n+1);
}
int main()
{
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);
fgets(s,MaxL,stdin);
while(!feof(stdin))
{
if(s[0]=='0')
add(T,s+2);
if(s[0]=='1')
del(T,s+2);
if(s[0]=='2')
printf("%d\n",aparitii(T,s+2));
if(s[0]=='3')
printf("%d\n",prefix(T,s+2,0));
fgets(s,MaxL,stdin);
}
fclose(stdin);
fclose(stdout);
return 0;
}