Cod sursa(job #1986953)

Utilizator Mihaibv13Mihai Stoian Mihaibv13 Data 29 mai 2017 13:30:00
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
#include <cstdio>
#include <iostream>

FILE *g=fopen("trie.out","w");
struct trie
        {
            int nf,inf;
            trie *fiu[26];
        };

void put_in_trie(char s[],trie *t)
{
    int i,cc,j;
    trie *nodc=t;
    for(i=0;s[i];i++)
    {
        cc=s[i]-'a';
        if(nodc->fiu[cc]) nodc=nodc->fiu[cc];
        else
        {
            nodc->fiu[cc]=new trie;
            nodc->nf++;
            nodc=nodc->fiu[cc];
            nodc->nf=0;
            nodc->inf=0;
            for(j=0;j<=25;j++)nodc->fiu[j]=NULL;
        }
    }
    nodc->inf++;
}

void sterge(char s[],trie *t)
{
    trie *traseu[30],*nodc=t;
    int i,cc;
    for(i=0;s[i];i++)
    {
        cc=s[i]-'a';
        nodc=nodc->fiu[cc];
        traseu[i]=nodc;
    }
    i--;
    traseu[i]->inf--;
    while(i>0&&traseu[i]->inf==0&&traseu[i]->nf==0)
    {
        delete traseu[i];
        traseu[i-1]->nf--;
        traseu[i-1]->fiu[s[i]-'a']=NULL;
        i--;
    }
}

void nrap(char s[],trie *t)
{
    trie *traseu[30],*nodc=t;
    int i,cc;
    for(i=0;s[i];i++)
    {
        cc=s[i]-'a';
        if(nodc->fiu[cc])
            nodc=nodc->fiu[cc];
        else
        {
            fprintf(g,"0\n");
            return;
        }
        traseu[i]=nodc;
    }
    i--;
    fprintf(g,"%d\n",traseu[i]->inf);
}

void longestpref(char s[],trie *t)
{
    trie *nodc=t;
    int i,cc;
    for(i=0;s[i];i++)
    {
        cc=s[i]-'a';
        if(nodc->fiu[cc]>0) /// >0
            nodc=nodc->fiu[cc];


        else
            break;
    }
    fprintf(g,"%d\n",i);
}

int main()
{
    trie *t;
    t=new trie;
    int op;
    t->nf=0;
    t->inf=0;
    int i;
    for(i=0;i<=25;i++)t->fiu[i]=NULL;
    FILE *f=fopen("trie.in","r");
    char s[25];
    while(1)
    {
        int q=fscanf(f,"%d%s",&op,s);
        if(q<=0)break;
        if(op==0)put_in_trie(s,t);
        if(op==1)sterge(s,t);
        if(op==2)nrap(s,t);
        if(op==3)longestpref(s,t);
    }
    return 0;
}