Cod sursa(job #1316604)

Utilizator heracleRadu Muntean heracle Data 13 ianuarie 2015 22:23:34
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <cstdio>
#include <cstring>

FILE* in=fopen("trie.in","r");
FILE* out=fopen("trie.out","w");

const int Q=22,W=100006;

struct nod{
    int term,part;
    char *read[26];
    int size[26];
    nod *to[26];
    nod()
    {
        for(int i=0; i<26; i++)
        {
            read[i]=NULL;
            to[i]=NULL;
            size[i]=0;
        }
    }
} ;

char c[W][Q];

nod* add(nod *p,char v[], int sz)
{
    if(p==NULL)
    {
        p=new nod;
    }

    if(sz==0)
    {
        p->term++;
        return p;
    }

    char c=v[0]-'a';

    int cm=0;

    if(p->to[c]==NULL)
    {
        p->read[c]=v;
        p->size[c]=sz;
        p->to[c]=add(p->to[c],v+sz,0);
    }
    else
    {
        for(cm=1; p->read[c][cm]==v[cm] && cm<=sz && cm<=p->size[c]; cm++);

        cm--;

        nod *aux,*aux2;

        if(cm==p->size[c])
        {
            p->to[c]=add(p->to[c],v+cm,sz-cm);
        }
        else
        {
            aux=p->to[c];


            aux2=add(p->to[c],p->read[c]+cm,p->size[c]-cm);



            p->size[c]=cm;
            add(p->to[c],v+cm,sz-cm);

        }
    }
    p->part++;
    return p;
}

int main()
{
    int x,k=0;

    nod *start=new nod;

    int sz;

    while(fscanf(in,"%d ",&x)==1)
    {
        k++;
        fscanf(in,"%s\n",c[k]);

        sz=strlen(c[k]);

        if(x==0)
            add(start,c[k],sz-1);

    }


    return 0;
}