Pagini recente » Cod sursa (job #1636353) | Cod sursa (job #2216621) | Cod sursa (job #1731547) | Cod sursa (job #254009) | Cod sursa (job #425056)
Cod sursa(job #425056)
#include<stdio.h>
#include<string.h>
#define Nmax 31
#define Sgm 28
#define Ch *s-'a'
struct Trie
{
int cnt,nrfii;
Trie *fiu[ Sgm ];
Trie()
{
cnt=nrfii=0;
memset(fiu,0,sizeof(fiu));
}
};
Trie *T=new Trie;
char S[Nmax];
void ins(Trie *nod,char *s)
{
if ( *s == '\n' )
{
nod->cnt++;
return ;
}
if (nod->fiu[ Ch ]==0)
{
nod->fiu[ Ch ]=new Trie;
nod->nrfii++;
}
ins( nod->fiu[Ch] , s+1);
}
int del(Trie *nod,char *s)
{
if (*s=='\n')
nod->cnt--;
else
if (del(nod->fiu[ Ch ],s+1))
{
nod->nrfii--;
nod->fiu[ Ch ]=0;
}
if (nod->nrfii==0 && nod->cnt==0 && nod != T)
{
delete nod;
return 1;
}
return 0;
}
int que(Trie *nod,char *s)
{
if (*s=='\n')
return nod->cnt;
if (nod->fiu[Ch])
return que(nod->fiu[Ch],s+1);
return 0;
}
int pre(Trie *nod,char *s,int k)
{
if (*s=='\n' || nod->fiu[Ch]==0)
return k;
return pre(nod->fiu[Ch],s+1,k+1);
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
while(!feof(stdin))
{
fgets(S,Nmax,stdin);
if (S[0]=='0')
ins(T,S+2);
if (S[0]=='1')
del(T,S+2);
if (S[0]=='2')
printf("%d\n",que(T,S+2));
if (S[0]=='3')
printf("%d\n",pre(T,S+2,0));
}
return 0;
}