Cod sursa(job #2197062)

Utilizator aditzu7Adrian Capraru aditzu7 Data 21 aprilie 2018 08:57:15
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <string.h>
#include <stdio.h>
using namespace std;
FILE*f=fopen("trie.in","r");
FILE*g=fopen("trie.out","w");
char s[32];
struct trie{
int val,nrfii;
trie *fiu[26];
    trie() {
        val=nrfii=0;
        memset(fiu,0,sizeof(fiu));
}
}*rad;
void inserare(trie *nod,char *s){
if(*s=='\n'){
    nod->val++;return;
}
if(nod->fiu[*s-'a']==NULL)
{nod->fiu[*s-'a']=new trie;
nod->nrfii++;


}
inserare(nod->fiu[*s-'a'],s+1);
}
int stergere(trie *nod,char *s){
if(*s=='\n'){
    nod->val--;
}
else if(stergere(nod->fiu[*s-'a'],s+1)){
    nod->fiu[*s-'a']=0;
    nod->nrfii--;

}
if(nod->val==0&&nod->nrfii==0&&nod!=rad){
    delete nod;
    return 1;

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


}
int prefix(trie *nod,char *s,int k) {
    if(*s=='\n'||nod->fiu[*s-'a']==0)
        return k;
    return prefix(nod->fiu[*s-'a'],s+1,k+1);
}
int main()
{rad=new trie;
  fgets(s,32,f);
   while(!feof(f)){
    switch(s[0]){
case '0':inserare(rad,s+2);break;
case '1':stergere(rad,s+2);break;
case '2':fprintf(g,"%d\n",afis(rad,s+2));break;
case '3':fprintf(g,"%d\n",prefix(rad,s+2,0));break;




    }

  fgets(s,32,f);


   }


    return 0;
}