Cod sursa(job #236006)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 26 decembrie 2008 14:59:30
Problema Trie Scor 25
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include<stdio.h>
#include<string.h>
struct nod{ int fr,end;nod *next[26];};
nod *root,*paux,*pnew;
int lung,i,ctoi,r;
char *op,*c;
void readd(),solve(),A(),D(),N(),P(),aloca();
int main()
{
	readd();
	solve();
	return 0;
}
void readd()
{
	freopen("trie.in","rt",stdin);
	freopen("trie.out","wt",stdout);
}
void solve()
{       op=new char[35];c=op+2;
	aloca();root=pnew;
	while(fgets(op,30,stdin))
	{
		if(op[0]=='0'){A();continue;}
		if(op[0]=='1'){D();continue;}
		if(op[0]=='2'){N();continue;}
		if(op[0]=='3') P();
	}
}
void A()
{ lung=strlen(c);paux=root;
  for(i=0;i<lung-1;i++)
  { ctoi=(int)(c[i]-'a');
    if(!paux->next[ctoi]){ aloca();paux->next[ctoi]=pnew;}
    paux=paux->next[ctoi];paux->fr++;
  }
  paux->end++;
}
void D()
{ int u=0,ci[25];
  nod *cp[25];
  lung=strlen(c);paux=root;cp[0]=root;
  for(i=0;i<lung-1;i++)
  { ctoi=(int)(c[i]-'a');
    ci[++u]=ctoi;
    paux=paux->next[ctoi];
    paux->fr--;
    cp[u]=paux;
  }
  paux->end--;
  for(i=u;i;i--)
  { if(cp[i]->fr)return;
    paux=cp[i];
    pnew=cp[i-1];
    pnew->next[ci[i]]=0;
    delete paux;
  }
}
void N()
{ lung=strlen(c);paux=root;
  for(i=0;i<lung-1;i++)
  { ctoi=(int)(c[i]-'a');
    if(!paux->next[ctoi]){printf("0\n");return;}
    paux=paux->next[ctoi];
  }
  printf("%d\n",paux->end);
}
void P()
{ int prefix=0;
  lung=strlen(c);paux=root;
  for(i=0;i<lung;i++)
  { ctoi=(int)(c[i]-'a');
    if(!paux->next[ctoi]){printf("%d\n",prefix);return;}
    paux=paux->next[ctoi];prefix++;
  }
}
void aloca()
{
	pnew=new nod;
	pnew->fr=0;pnew->end=0;
	for(int j=0;j<26;j++)pnew->next[j]=0;
}