Pagini recente » Cod sursa (job #261312) | Cod sursa (job #1738163) | Cod sursa (job #737095) | Cod sursa (job #888440) | Cod sursa (job #244384)
Cod sursa(job #244384)
#include <cstdio>
#include <cstring>
using namespace std;
char s[50];
struct trie
{
int numara,total;
trie *fiu[26];
trie()
{
numara=total=0;
memset(fiu,0,sizeof(fiu));
}
};
trie *t1=new trie;
void baga(trie *node,char *s)
{
if(*s=='\n')
{
node->numara++;
return;
}
int poz=*s-'a';
if(node->fiu[poz]==0)
{
node->fiu[poz]=new trie;
node->total ++;
}
baga(node->fiu[poz],s+1);
}
int sterge(trie *node,char *s)
{
if(*s=='\n')
node->numara--;
else
if(sterge(node->fiu[*s-'a'],s+1))
{
node->fiu[*s-'a']=0;
node->total--;
}
if(node->numara==0 && node->total==0 && node != t1 )
{
delete node;
return 1;
}
return 0;
}
int query(trie *node,char *s)
{
if(*s=='\n')
return node->numara;
if(node->fiu[*s-'a'])
return query(node->fiu[*s-'a'],s+1);
return 0;
}
int prefix(trie *node,char *s,int nr)
{
if(*s=='\n' || node->fiu[*s-'a']==0)
return nr;
return prefix(node->fiu[*s-'a'],s+1,nr+1);
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
fgets(s,32,stdin);
while(!feof(stdin))
{
switch(s[0])
{
case '0': baga(t1,s+2); break;
case '1': sterge(t1,s+2); break;
case '2': printf("%d\n",query(t1,s+2)); break;
case '3': printf("%d\n",prefix(t1,s+2,0)); break;
}
fgets(s,32,stdin);
}
return 0;
}