Cod sursa(job #1517636)

Utilizator refugiatBoni Daniel Stefan refugiat Data 4 noiembrie 2015 17:33:35
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include<iostream>
#include<fstream>
#include<cstdio>
#include<cstring>
#define CH (*s-'a')
using namespace std;
FILE*si=fopen("trie.in","r");
//ifstream si("barbar.in");
ofstream so("trie.out");
struct trie
{
    int cont,nrfii;
    trie* v[26];
    trie()
    {
        cont=nrfii=0;
        memset(v,0,sizeof(v));
    }
};
trie *t=new trie;
void ins(trie* nod,char* s)
{
    if(*s=='\n')
    {
        nod->cont++;
        return;
    }
    if(nod->v[CH]==0)
    {
        nod->v[CH]=new trie;
        nod->nrfii++;
    }
    ins(nod->v[CH],s+1);
}
int del(trie* nod,char* s)
{
    if(*s=='\n')
    {
        nod->cont--;
    }
    else
        if(del(nod->v[CH],s+1))
        {
            nod->v[CH]=0;
            nod->nrfii--;
        }
    if(nod->cont==0&&nod->nrfii==0&&nod!=t)
    {
        delete nod;
        return 1;
    }
    return 0;
}
int apar(trie* nod,char *s)
{
    if(*s=='\n')
        return nod->cont;

    if(nod->v[CH])
        return apar(nod->v[CH],s+1);
    return 0;
}
int pref(trie* nod,char *s,int k)
{
    if(*s=='\n'||nod->v[CH]==0)
        return k;
    return pref(nod->v[CH],s+1,k+1);
}
int main()
{
    char lin[32];
    fgets(lin,32,si);
    while(!feof(si))
    {
        switch(lin[0])
        {
            case '0':ins(t,lin+2); break;
            case '1':del(t,lin+2); break;
            case '2':so<<apar(t,lin+2)<<'\n'; break;
            case '3':so<<pref(t,lin+2,0)<<'\n'; break;
        }
        fgets(lin,32,si);
    }

    so.close();
    //si.close();
    return 0;
}