Cod sursa(job #2487555)

Utilizator ivan.tudorIvan Tudor ivan.tudor Data 4 noiembrie 2019 22:14:47
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <iostream>
#include<cstdio>
using namespace std;
const int SIGMA=26;
struct Trie{
  Trie *children[SIGMA];
  int nWord,nChild;
  Trie (){
    nWord=0;
    nChild=0;
    for(int i=0;i<SIGMA;i++)
      children[i]=NULL;
  }
};
Trie *root= new Trie;
void insert_trie(Trie *nod,char *s){
  if(s[0]=='\0'){
    nod->nWord++;
    return;
  }
  else{
    if(nod->children[s[0]-'a']==NULL){
      nod->children[s[0]-'a']=new Trie;
      nod->nChild++;
    }
    insert_trie(nod->children[s[0]-'a'],s+1);
  }
}
bool delete_trie(Trie *nod,char *s){
  if(s[0]=='\0'){
    nod->nWord--;
  }
  else if(delete_trie(nod->children[s[0]-'a'],s+1)){
    nod->nChild--;
    nod->children[s[0]-'a']=NULL;
  }
  if(nod->nWord==0 && nod->nChild==0 && nod!=root){
    delete nod;
    return 1;
  }
  return 0;
}
int find_trie(Trie *nod,char *s){
  if(s[0]=='\0'){
    return nod->nWord;
  }
  if(nod->children[s[0]-'a']==NULL)
    return 0;
  return find_trie(nod->children[s[0]-'a'],s+1);
}
int findpref_trie(Trie *nod,char *s){
  if(s[0]=='\0')
    return 0;
  if(nod->children[s[0]-'a']==NULL)
    return 0;
  return 1+findpref_trie(nod->children[s[0]-'a'],s+1);
}
char s[30];
int main()
{
  int type;
  FILE*fin,*fout;
  fin=fopen("trie.in","r");
  fout=fopen("trie.out","w");
  while(!feof(fin)){
    fscanf(fin,"%d %s ",&type,s);
    if(type==0){
      insert_trie(root,s);
    }
    else if(type==1){
      delete_trie(root,s);
    }
    else if(type==2){
      fprintf(fout,"%d\n",find_trie(root,s));
    }
    else{
      fprintf(fout,"%d\n",findpref_trie(root,s));
    }
  }
  return 0;
}