Pagini recente » Cod sursa (job #880948) | Cod sursa (job #1150945) | Cod sursa (job #1814380) | Cod sursa (job #187729) | Cod sursa (job #2197071)
#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,sizeof(fiu));
}
}*T;
char linie[40];
int cerinta;
void ins(trie *nod,char *s)
{
if(*s=='\n')
{
nod->cnt++;
return;
}
if(nod->fiu[C]==NULL)
{
nod->fiu[C]=new trie;
nod->nrfii++;
}
ins(nod->fiu[C],s+1);
}
int sterg(trie *nod,char *s)
{
if(*s=='\n')
{
nod->cnt--;
}
else if(sterg(nod->fiu[C],s+1))
{
nod->nrfii--;
nod->fiu[C]=0;
}
if(nod->cnt==0 &&nod->nrfii==0&& nod!=T){
delete nod;return 1;}
return 0;
}
int numar(trie *nod,char *s)
{
if(*s=='\n') return nod->cnt;
if(nod->fiu[C]) return numar(nod->fiu[C],s+1);
return 0;
}
int pref(trie *nod,char *s,int k)
{
if(*s=='\n'||nod->fiu[C]==NULL)
return k;
pref(nod->fiu[C],s+1,k+1);
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
fgets(linie,40,stdin);
T=new trie;
while(!feof(stdin))
{
cerinta=linie[0]-'0';
if(cerinta==0) ins(T,linie+2);
if(cerinta==1) sterg(T,linie+2);
if(cerinta==2) printf("%d\n",numar(T,linie+2));
if(cerinta==3) printf("%d\n",pref(T,linie+2,0));
fgets(linie,40,stdin);
}
return 0;
}