Cod sursa(job #2197071)

Utilizator alexandruilieAlex Ilie alexandruilie Data 21 aprilie 2018 09:25:35
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <cstdio>
#include <cstring>
#define C (*s-'a')
using namespace std;
struct trie
{
    int cnt,nrfii;
    trie *fiu[26];
    trie()
    {
        cnt=nrfii=0;
        memset(fiu,0,sizeof(fiu));
    }
}*T;
char linie[40];
int cerinta;
void ins(trie *nod,char *s)
{
    if(*s=='\n')
    {
        nod->cnt++;
        return;
    }
    if(nod->fiu[C]==NULL)
    {
        nod->fiu[C]=new trie;
        nod->nrfii++;
    }
    ins(nod->fiu[C],s+1);
}
int sterg(trie *nod,char *s)
{
    if(*s=='\n')
    {
        nod->cnt--;
    }
    else if(sterg(nod->fiu[C],s+1))
    {
    nod->nrfii--;
    nod->fiu[C]=0;
    }
    if(nod->cnt==0 &&nod->nrfii==0&& nod!=T){
        delete nod;return 1;}
        return 0;
}
int numar(trie *nod,char *s)
{
    if(*s=='\n') return nod->cnt;
    if(nod->fiu[C]) return numar(nod->fiu[C],s+1);
    return 0;
}
int pref(trie *nod,char *s,int k)
{
    if(*s=='\n'||nod->fiu[C]==NULL)
        return k;
    pref(nod->fiu[C],s+1,k+1);
}
int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    fgets(linie,40,stdin);
    T=new trie;
    while(!feof(stdin))
    {
        cerinta=linie[0]-'0';
        if(cerinta==0) ins(T,linie+2);
        if(cerinta==1) sterg(T,linie+2);
        if(cerinta==2) printf("%d\n",numar(T,linie+2));
        if(cerinta==3) printf("%d\n",pref(T,linie+2,0));
        fgets(linie,40,stdin);
    }
    return 0;
}