Pagini recente » Cod sursa (job #1080825) | Cod sursa (job #445458) | Cod sursa (job #1071202) | Cod sursa (job #735373)
Cod sursa(job #735373)
#include <cstdio>
#include <cstring>
using namespace std;
#define dim 100005
char sir[dim];
struct trie
{
int cnt, nr_fii;
trie *fiu[26];
trie()
{
cnt=nr_fii=0;
memset(fiu,0,sizeof(fiu));
}
};
trie *T=new trie;
void insert(trie *nod, char *p)
{
if(*p=='\n')
{
nod->cnt++;
return ;
}
if( nod->fiu[*p-'a']==0)
{
nod->fiu[*p-'a']=new trie;
nod->nr_fii++;
}
insert(nod->fiu[*p-'a'],p+1);
}
int sterge(trie *nod, char *p)
{
if(*p=='\n')
nod->cnt--;
else
if(sterge(nod->fiu[*p-'a'],p+1))
{
nod->fiu[*p-'a']=0;
nod->nr_fii--;
}
if(nod->cnt==0 && nod->nr_fii==0 && nod!=T)
{
delete nod;
return 1;
}
return 0;
}
int aparitii(trie *nod, char *p)
{
if(*p=='\n')
return nod->cnt;
if(nod->fiu[*p-'a']!=0)
return aparitii(nod->fiu[*p-'a'],p+1);
return 0;
}
int prefix(trie *nod, char *p,int k)
{
if(*p=='\n' || nod->fiu[*p-'a']==0)
return k;
return prefix(nod->fiu[*p-'a'],p+1,k+1);
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
while(fgets(sir,dim,stdin))
{
if(sir[0]=='0')insert(T,sir+2);
if(sir[0]=='1')sterge(T,sir+2);
if(sir[0]=='2')printf("%d\n", aparitii(T,sir+2));
if(sir[0]=='3')printf("%d\n", prefix(T,sir+2,0));
}
return 0;
}