Cod sursa(job #304600)

Utilizator DjSefuWrong name DjSefu Data 14 aprilie 2009 14:37:58
Problema Trie Scor 25
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include<stdio.h>
#include<string.h>    
using namespace std;
struct trie
{ int cnt;int son;
  trie *sons[26];
  trie(){cnt=son=0;memset(sons,0,sizeof(sons));}
};
trie *root=new trie;
void add(trie *nod, char *s)
{ if(*s=='\n') { ++nod->cnt;return;}
  if(!nod->sons[*s-'a']) { nod->sons[*s-'a']=new trie;
                         }
  ++nod->son;
  add(nod->sons[*s-'a'],s+1);
}
bool del(trie *nod,char *s)
{ if(*s=='\n') --nod->cnt;
  else if(del(nod->sons[*s-'a'],s+1)){ nod->sons[*s-'a']=0;
                                       --nod->son;
                                       }
  if(nod->cnt==0&&nod->son==0&&nod!=root) { delete nod;return 1;}
  return 0;
}
int que(trie *nod,char *s)
{ if(*s=='\n') return nod->cnt;
  if(nod->sons[*s-'a']) return que(nod->sons[*s-'a'],s+1);
  return 0;
}
int pre(trie *nod,char *s,int ord)
{ if(*s=='\n'||nod->sons[*s-'a']==0) return ord;
  return pre(nod->sons[*s-'a'],s+1,ord+1);
}
char a[40];
int main()
{ freopen("trie.in","r",stdin);
  freopen("trie.out","w",stdout);
  while(!feof(stdin)){ fgets(a,sizeof(a),stdin);
                       if(a[0]=='0') add(root,a+2);
                       else if(a[0]=='1') del(root,a+2);
                       else if(a[0]=='2') printf("%d\n",que(root,a+2));
                                              else printf("%d\n",pre(root,a+2,0));
                       }
  fclose(stdin);
  fclose(stdout);
  return 0;
}