Cod sursa(job #1707190)

Utilizator ris99Istrate Ruxandra ris99 Data 24 mai 2016 15:57:32
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb

#include <cstring>
#include <cstdio>
#define ch (*s-'a')
using namespace std;
struct trie
{ int cnt,nrfii;
  trie *fiu[26];
  trie()
  { cnt=nrfii=0;
   memset(fiu,0,sizeof(fiu));

  }

};

trie *t=new trie;
void ins(trie *nod,char *s)
{ if(*s=='\n') {nod->cnt++;return;}
  if(nod->fiu[ch]==0)
  { nod->fiu[ch]=new trie;
    nod->nrfii++;
  }
  ins(nod->fiu[ch],s+1);

}
int del (trie *nod,char *s)
{ if( *s=='\n') nod->cnt--;
  else if (del(nod->fiu[ch],s+1))
  { nod->fiu[ch]=0;
    nod->nrfii--;
  }
  if(nod->cnt==0 && nod->nrfii==0 && nod != t)
  { delete nod;
  return 1;
 }
   return 0;
}
int pre (trie *nod, char *s, int k)
{ if(*s=='\n'||nod->fiu[ch]==0) return k;
  return pre(nod->fiu[ch],s+1,k+1);

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

}
int main()
{ char line[32];
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
fgets(line,32,stdin);
while (!feof(stdin))
{ switch (line[0])
{ case '0' : ins(t,line+2);break;
 case '1':del(t,line+2);break;
 case '2': printf ("%d\n",que(t,line+2));break;
 case '3':printf("%d\n",pre(t,line+2,0));break;

}
 fgets (line,32,stdin);
}

    return 0;
}