Cod sursa(job #235979)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 26 decembrie 2008 13:58:09
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include<stdio.h>
#include<string.h>
struct nod{ char lit;int fr,gr;nod *next[27],*dad;};
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;i++)
  { ctoi=(c[i]=='\n')?26:(int)(c[i]-'a');
    if(!paux->next[ctoi]){ aloca();paux->next[ctoi]=pnew;pnew->dad=paux;paux->gr++;}
    paux=paux->next[ctoi];paux->fr++;
  }
}
void D()
{ lung=strlen(c);paux=root;
  for(i=0;i<lung;i++)
  { ctoi=(c[i]=='\n')?26:(int)(c[i]-'a');
    paux=paux->next[ctoi];
  }
  for(i=lung-1;i>=0;i--)
  { paux->fr--;r=paux->fr;
    paux=paux->dad;
    if(r)continue;
    ctoi=(c[i]=='\n')?26:(int)(c[i]-'a');
    pnew=paux->next[ctoi];
    paux->next[ctoi]=0;
    delete pnew;
  }
}
void N()
{ lung=strlen(c);paux=root;
  for(i=0;i<lung;i++)
  { ctoi=(c[i]=='\n')?26:(int)(c[i]-'a');
    if(!paux->next[ctoi]){printf("0\n");return;}
    paux=paux->next[ctoi];
  }
  printf("%d\n",paux->fr);
}
void P()
{ int prefix=0;
  lung=strlen(c);paux=root;
  for(i=0;i<lung;i++)
  { ctoi=(c[i]=='\n')?26:(int)(c[i]-'a');
    if(!paux->next[ctoi]||ctoi==26){printf("%d\n",prefix);return;}
    paux=paux->next[ctoi];prefix++;
  }
}
void aloca()
{
	pnew=new nod;
	pnew->fr=0;pnew->dad=0;pnew->gr=0;pnew->lit=0;
	for(int j=0;j<27;j++)pnew->next[j]=0;
}