Cod sursa(job #1881593)

Utilizator cella.florescuCella Florescu cella.florescu Data 16 februarie 2017 16:43:05
Problema Trie Scor 100
Compilator cpp Status done
Runda cerculdeinfo-lectiile9_10_11_12_13 Marime 1.41 kb
#include <cstdio>
#include <cstring>
#define MAXLIT 26
#define MAXLUN 25

using namespace std;

struct trie{
  int cate, nfii;
  trie *fii[MAXLIT];
  trie(){
    cate=nfii=0;
    memset(fii, 0, sizeof(fii));
  }
};

trie *t=new trie;

void add(trie *nod, char *s){
  if(*s=='\n'){
    nod->cate++;
    return;
  }
  if(nod->fii[*s-'a']==0){
    nod->nfii++;
    nod->fii[*s-'a']=new trie;
  }
  add(nod->fii[*s-'a'], s+1);
}

int del(trie *nod, char *s){
  if(*s=='\n')
    nod->cate--;
  else if(del(nod->fii[*s-'a'], s+1)){
    nod->fii[*s-'a']=0;
    nod->nfii--;
  }
  if(nod->nfii==0 && nod->cate==0 && nod!=t){
    delete nod;
    return 1;
  }
  return 0;
}

int nrap(trie *nod, char *s){
  if(*s=='\n')
    return nod->cate;
  if(nod->fii[*s-'a'])
    return nrap(nod->fii[*s-'a'], s+1);
  return 0;
}

int pref(trie *nod, char *s, int l){
  if(*s=='\n')
    return l;
  if(nod->fii[*s-'a'])
    return pref(nod->fii[*s-'a'], s+1, l+1);
  return l;
}

int main()
{
    FILE *fin, *fout;
    char q[MAXLUN];
    fin=fopen("trie.in", "r");
    fgets(q, MAXLUN, fin);
    fout=fopen("trie.out", "w");
    while(feof(fin)==0){
      switch(q[0]){
        case '0': add(t, q+2); break;
        case '1': del(t, q+2); break;
        case '2': fprintf(fout, "%d\n", nrap(t, q+2)); break;
        case '3': fprintf(fout, "%d\n", pref(t, q+2, 0)); break;
      }
      fgets(q, MAXLUN, fin);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}