Pagini recente » Cod sursa (job #2932131) | Istoria paginii runda/preoni_2018 | Cod sursa (job #229062) | Istoria paginii runda/concurs_11_12_02_26 | Cod sursa (job #2313628)
#include<cstdio>
#include<cstring>
#define C (*s - 'a')
using namespace std;
struct Trie
{
int cnt,nrfii;
Trie *fiu[26];
Trie()
{
cnt=nrfii=0,memset(fiu,0,26);
}
};
Trie *T=new Trie;
void ins(Trie *nod,char *s)
{
if(*s=='\n')
{
nod->cnt++;
return;
}
if(!nod->fiu[C])
{
nod->fiu[C]=new Trie;
nod->nrfii++;
}
ins(nod->fiu[C],s+1);
}
int del(Trie *nod,char *s )
{
if(*s=='\n')
nod->cnt--;
else if(del( nod->fiu[C],s+1))
nod->fiu[C]=0,nod->nrfii--;
if(!nod->cnt&&!nod->nrfii&&nod!=T)
{
delete nod;
return 1;
}
return 0;
}
int que(Trie *nod,char *s)
{
if(*s=='\n')
return nod->cnt;
if(nod->fiu[C])
return que(nod->fiu[C],s+1);
return 0;
}
int pre(Trie *nod,char *s,int k)
{
if(*s=='\n'||!nod->fiu[C])
return k;
return pre(nod->fiu[C],s+1,k+1);
}
int main()
{
char l[32];
freopen("trie.in","r",stdin),freopen("trie.out","w",stdout),fgets(l,32,stdin);
while(!feof(stdin))
{
switch(l[0])
{
case '0':
ins(T,l+2);
break;
case '1':
del(T,l+2);
break;
case '2':
printf("%d\n",que(T,l+2));
break;
case '3':
printf("%d\n",pre(T,l+2,0));
break;
}
fgets(l,32,stdin);
}
}