Cod sursa(job #306012)

Utilizator DjSefuWrong name DjSefu Data 19 aprilie 2009 13:44:42
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 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') ]==0) { nod->sons[ (*s-'a') ]=new trie;
                         }
  ++nod->son;
  add(nod->sons[ (*s-'a') ],s+1);
}
int 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);
  fgets(a,sizeof(a),stdin);
  while(!feof(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;
}