Cod sursa(job #1638830)

Utilizator ZeBuGgErCasapu Andreas ZeBuGgEr Data 8 martie 2016 09:30:04
Problema Trie Scor 45
Compilator cpp Status done
Runda Arhiva educationala Marime 2.47 kb
#include<stdio.h>
#include<vector>
#include<string.h>

using namespace std;

struct str
{
   int fiu[27];
   int apar;
   int sfr;
}v[150001];

vector<int> del;

char ch[25];
int type,nod,pos=2;

FILE *fin,*fout;

void add()
{
    int lg=strlen(ch);
    nod=1;
    for(int i=0;i<lg;i++)
    {
        if(v[nod].fiu[ch[i]-'a']==0)
        {
            if(del.empty())
            {
                v[nod].fiu[ch[i]-'a']=pos;
                pos++;
            }
            else
            {
                v[nod].fiu[ch[i]-'a']=del.back();
                del.pop_back();
            }
        }
        v[v[nod].fiu[ch[i]-'a']].apar++;
        //fprintf(fout,"1 %c %d %d\n\n",ch[i],v[nod].fiu[ch[i]-'a'],v[v[nod].fiu[ch[i]-'a']].apar);
        nod=v[nod].fiu[ch[i]-'a'];
    }
    v[nod].sfr++;
}

void rid()
{
    int lg=strlen(ch);
    nod=1;
    int nod1=1;
    for(int i=0;i<lg;i++)
    {
        v[v[nod].fiu[ch[i]-'a']].apar--;
        //fprintf(fout,"2 %d %d\n\n",nod,v[nod].apar);
        nod1=v[nod].fiu[ch[i]-'a'];
        if(v[v[nod].fiu[ch[i]-'a']].apar==0)
        {
            del.push_back(v[nod].fiu[ch[i]-'a']);
            v[nod].fiu[ch[i]-'a']=0;
        }
        nod=nod1;
    }
    v[nod].sfr--;
}

void tip1()
{
    int lg=strlen(ch);
    nod=1;
    for(int i=0;i<lg;i++)
    {
        if(v[nod].fiu[ch[i]-'a']!=0)
        {
            nod=v[nod].fiu[ch[i]-'a'];
        }
        else
        {
            nod=0;
            break;
        }
    }
    fprintf(fout,"%d\n",v[nod].sfr);
}

void tip2()
{
    int lg=strlen(ch);
    nod=1;
    int ln=0;
    for(int i=0;i<lg;i++)
    {
        //fprintf(fout,"%c %d %d %d\n",ch[i],nod,v[nod].fiu[ch[i]-'a'],v[nod].apar);
        if(v[nod].fiu[ch[i]-'a']!=0)
        {
            ln++;
            nod=v[nod].fiu[ch[i]-'a'];
            if(v[nod].apar==0)
            {
                ln--;
                break;
            }
        }
        else
        {
            break;
        }
    }
    fprintf(fout,"%d\n",ln);
}

int main()
{
    fin=fopen("trie.in","r");
    fout=fopen("trie.out","w");

    while(!feof(fin))
    {
        fscanf(fin,"%d %s",&type,ch);
        if(type==0)
        {
            add();
        }
        else if(type==1)
        {
            rid();
        }
        else if(type==2)
        {
            tip1();
        }
        else
        {
            tip2();
        }
    }
}