Cod sursa(job #2062778)

Utilizator PinkiePie1189Preoteasa Mircea-Costin PinkiePie1189 Data 10 noiembrie 2017 20:27:39
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.22 kb
#include<stdio.h>
#include<string.h>
#define NUM_SYMBOLS_MAX 26
#define MAXBUF 20
struct Node
{
    Node();
    bool is_leaf;
    int nr_occ;
    Node* son[NUM_SYMBOLS_MAX];
};
//FUNCTII TRIE
void Add();
void Remove();
int Occ();
int LCP();
FILE*fin,*fout;
Node* root;
char buf[MAXBUF];
int len; //TOATE FUNCTIILE DE MAI SUS ACTIONEAZA PE SIRUL ASTA
int main()
{
    fin=fopen("trie.in","r");
    fout=fopen("trie.out","w");
    root=new Node;
    int op;
    fscanf(fin,"%d %s",&op,buf);
    while(!feof(fin))
    {
        len=strlen(buf);
        if(op==0)
        {
            Add();
        }
        if(op==1)
        {
            Remove();
        }
        if(op==2)
        {
            fprintf(fout,"%d\n",Occ());
        }
        if(op==3)
        {
            fprintf(fout,"%d\n",LCP());
        }
        fscanf(fin,"%d %s",&op,buf);
    }
}
Node::Node()
{
    is_leaf=true;
    nr_occ=0;
    for(int i=0;i<NUM_SYMBOLS_MAX;i++)
    {
        son[i]=NULL;
    }
}
void Add()
{
    Node*p=root;
    for(int i=0;i<len;i++)
    {
        if(p->son[buf[i]-'a']==NULL)
        {
            p->son[buf[i]-'a']=new Node;
            if(p->is_leaf)
            {
                p->is_leaf=false;
            }
        }
        p->son[buf[i]-'a']->nr_occ++;
        p=p->son[buf[i]-'a'];
    }
}
void Remove()
{
    Node*p=root;
    for(int i=0;i<len;i++)
    {
        p->son[buf[i]-'a']->nr_occ--;
        Node* toDelete=p;
        p=p->son[buf[i]-'a'];
        if(toDelete->son[buf[i]-'a']->nr_occ==0)
        {
            toDelete->son[buf[i]-'a']=NULL;
        }
        if(toDelete->nr_occ==0 && toDelete!=root)
        {
            delete toDelete;
        }
    }
}
int Occ()
{
    Node*p=root;
    for(int i=0;i<len && p!=NULL;i++)
    {
        p=p->son[buf[i]-'a'];
    }
    if(p==NULL)
    {
        return 0;
    }
    if(p->is_leaf)
    {
        return p->nr_occ;
    }
    else
    {
        return 0;
    }

}
int LCP()
{
    int ans=0;
    Node*p=root;
    for(int i=0;i<len && p!=NULL;i++)
    {
        p=p->son[buf[i]-'a'];
        if(p!=NULL)
        {
            ans++;
        }
    }
    return ans;
}