Pagini recente » Cod sursa (job #2419897) | Cod sursa (job #2933874) | Cod sursa (job #2197036) | Cod sursa (job #1324279) | Cod sursa (job #781729)
Cod sursa(job #781729)
#include<cstdio>
#include<cstring>
using namespace std;
char buff[32];
int intc;
struct trie
{int nr,nrfii;
trie* son[26];
trie()
{nr=0; nrfii=0;
for(int psi=0; psi<26; psi++)
son[psi]=0;}
};
trie *T=new trie;
void add(trie *nod, char *buff)
{if(*buff=='\n')
{nod->nr++;
return;}
intc=*buff-'a';
if(nod->son[intc]==0)
{nod->son[intc]=new trie;
nod->nrfii++;}
add(nod->son[intc],buff+1);
}
int erase(trie *nod, char *buff)
{if(*buff=='\n')
{nod->nr--;}
else
{intc=*buff-'a';
if(nod->son[intc])
if(erase(nod->son[intc],buff+1)==1)
{nod->son[intc]=0;
nod->nrfii--;}
}
if(nod->nr==0 && nod->nrfii==0 && nod!=T)
{delete nod;
return 1;}
return 0;
}
int count(trie *nod, char *buff)
{if(*buff=='\n')
return nod->nr;
intc=*buff-'a';
if(nod->son[intc])
return count(nod->son[intc],buff+1);
return 0;
}
int prefix(trie *nod, char *buff,int grad)
{intc=*buff-'a';
if(*buff=='\n' || nod->son[intc]==0)
return grad;
return prefix(nod->son[intc],buff+1,grad+1);
}
int main()
{freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
int caz;
fgets(buff,32,stdin);
while(!feof(stdin))
{
if(buff[0]=='0') add(T,buff+2); else
if(buff[0]=='1') erase(T,buff+2); else
if(buff[0]=='2') printf("%d\n",count(T,buff+2)); else
if(buff[0]=='3') printf("%d\n",prefix(T,buff+2,0));
fgets(buff,32,stdin);}
return 0;}