Pagini recente » Cod sursa (job #1504386) | Monitorul de evaluare | Istoria paginii utilizator/raluca_panainte | Cod sursa (job #2053746) | Cod sursa (job #739712)
Cod sursa(job #739712)
#include<cstdio>
#include<cstdlib>
#include<cstring>
char s[25];
struct node
{
int n;
node* c[26];
node()
{
n=0;
memset (c,0,26);
}
}rt;
void ins()
{
int n=strlen (s);
node *p=&rt;
for(int i=0;i<n;i++){
int idx=s[i]-'a';
if(!p->c[idx])
p->c[idx]=(node*)calloc (sizeof(node),1);
p=p->c[idx];
}
p->n++;
}
bool _del(node *p,int i,int l)
{
if(i==l){
p->n--;
if(p->n==0){
free (p);
return true;
}
return false;
}
node *np=p->c[s[i]-'a'];
if(_del (np,i+1,l)){
p->c[s[i]-'a']=0;
if(p->n)
return false;
if(p==&rt)
return false;
bool empty=true;
for(int i=0;i<26;i++)
if(p->c[i]){
empty=false;
break;
}
if(empty)
free (p);
return empty;
}
return false;
}
void del()
{
_del (&rt,0,strlen (s));
}
int cnt()
{
node *np=&rt;
int l=strlen (s);
for(int i=0;i<l;i++){
np=np->c[s[i]-'a'];
if(np==0)
return 0;
}
if(np==0)
return 0;
return np->n;
}
int prf()
{
node *np=&rt;
int l=strlen (s);
for(int i=0;i<l;i++){
int idx=s[i]-'a';
if(!np->c[idx])
return i;
np=np->c[idx];
}
return l;
}
int main()
{
freopen ("trie.in","r",stdin);
freopen ("trie.out","w",stdout);
while(1){
int o=-1;
scanf ("%d ",&o);
if(o==-1)
return 0;
gets (s);
switch(o){
case 0:
ins();
break;
case 1:
del();
break;
case 2:
printf ("%d\n",cnt());
break;
case 3:
printf ("%d\n",prf());
break;
}
}
}