Pagini recente » Cod sursa (job #1688569) | Cod sursa (job #407625)
Cod sursa(job #407625)
#include <stdio.h>
#include <string.h>
#define PopC *s-'a'
struct Trie{
int nrfii,cnt;
Trie *fiu[26];
Trie()
{
int i;
cnt=nrfii=0;
for(i=0;i<26;++i)
fiu[i]=0;
}
};
Trie *T=new Trie;
void insert(Trie *nod, char *s)
{
if(*s=='\n')
{
nod->cnt++;
return ;
}
if(nod->fiu[ PopC ] == 0)
{
nod->fiu [ PopC ] = new Trie; // Trie and Fail
nod->nrfii++;
}
insert(nod->fiu [ PopC] , s+1);
}
int del(Trie *nod, char *s)
{
if(*s=='\n')
nod->cnt--;
else
if(del(nod->fiu[ PopC],s+1))
{
nod->fiu[PopC]=0;
nod->nrfii--;
}
if(nod->cnt == 0 && nod->nrfii == 0 && nod!=T)
{
delete nod;
return 1;
}
return 0;
}
int querry(Trie *nod,char *s)
{
if(*s=='\n')
return nod->cnt;
if(nod->fiu[PopC])
return querry(nod->fiu[PopC],s+1);
return 0;
}
int pref(Trie *nod,char *s,int n)
{
if(*s=='\n' || nod->fiu[PopC]==0)
return n;
return pref(nod->fiu[PopC],s+1,n+1);
}
int main()
{
char buff[32];
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
fgets(buff , 32 ,stdin);
while(!feof(stdin))
{
switch(buff[0])
{
case '0':insert( T , buff+2); break;
case '1':del(T, buff+2); break;
case '2':printf("%d\n",querry(T,buff+2)); break;
case '3':printf("%d\n",pref(T,buff+2,0)); break;
}
fgets(buff , 32 ,stdin);
}
return 0;
}