Cod sursa(job #1722680)

Utilizator refugiatBoni Daniel Stefan refugiat Data 28 iunie 2016 17:58:48
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include<iostream>
#include<cstdio>
#include<cstring>
#define ch (*s-'a')
using namespace std;
FILE*si=fopen("trie.in","r");
FILE*so=fopen("trie.out","w");
struct trie
{
    int cont,nrfii;
    trie* v[26];
    trie()
    {
        cont=nrfii=0;
        memset(v,0,sizeof(v));
    }
};
trie* t=new trie;
void add(trie* nod,char* s)
{
    if(*s=='\n')
    {
        nod->cont++;
        return;
    }
    if(nod->v[ch]==0)
    {
        nod->v[ch]=new trie;
        nod->nrfii++;
    }
    add(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 nap(trie* nod,char *s)
{
    if(*s=='\n')
        return nod->cont;
    if(nod->v[ch])
        return nap(nod->v[ch],s+1);
    return 0;
}
int lcp(trie* nod,char *s,int k)
{
    if(*s=='\n'||nod->v[ch]==0)
        return k;
    return lcp(nod->v[ch],s+1,k+1);
}
int main()
{

    char lin[32];
    fgets(lin,32,si);
    while(!feof(si))
    {
        switch(lin[0])
        {
            case '0':add(t,lin+2); break;
            case '1':del(t,lin+2); break;
            case '2':fprintf(so,"%i\n",nap(t,lin+2)); break;
            case '3':fprintf(so,"%i\n",lcp(t,lin+2,0)); break;
        }
        fgets(lin,32,si);

    }
    fclose(so);
    return 0;
}