Cod sursa(job #2276772)

Utilizator 12222Fendt 1000 Vario 12222 Data 5 noiembrie 2018 12:22:46
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

struct Nod
{
    int nr,cnt;
    Nod *leg[25];
}*L;


int op;
char cuv[25];

void Insert()
{
    int lit;
    Nod *p,*q;

    p=L;
    for(int i=0;cuv[i];i++)
    {
        lit=cuv[i]-'a';
        if(p->leg[lit]==NULL)
        {
            q=new Nod;
            q->cnt=1;
            q->nr=0;

            for(int j=0;j<26;j++)
                q->leg[j]=NULL;

            p->leg[lit]=q;
            p=q;
        }
        else
        {
            p=p->leg[lit];
            p->cnt++;
        }
    }

    p->cnt++;
    p->nr++;
}

void Delete()
{
    int lit;
    Nod *p;
    p=L;

    for(int i=0;cuv[i];i++)
    {
        lit=cuv[i]-'a';
        p=p->leg[lit];
        p->cnt--;
    }

    p->cnt--;
    p->nr--;
}

void Nrap()
{
    int lit;
    Nod *p;

    p=L;

    for(int i=0;cuv[i];i++)
    {
        lit=cuv[i]-'a';
        if(p->leg[lit]==NULL)
        {
            fout<<"0\n";
            return ;
        }

        p=p->leg[lit];
    }

    fout<<(p->nr)<<"\n";
}

void Prefix()
{
    int lit,lg;
    Nod *p;

    lg=0;
    p=L;

    for(int i=0;cuv[i];i++)
    {
        lit=cuv[i]-'a';

        if(p->leg[lit]!=NULL && p->leg[lit]->cnt>0)
        {
            lg++;
            p=p->leg[lit];
        }
        else
        {
            fout<<lg<<"\n";
            return ;
        }
    }

    fout<<lg<<"\n";
}

int main()
{
    L=new Nod;
    L->nr=L->cnt=0;

    for(int i=0;i<26;i++)
        L->leg[i]=NULL;

    while(fin>>op>>cuv)
    {
        if(op==0)Insert();
        else if(op==1)Delete();
        else if(op==2)Nrap();
        else Prefix();
    }

    fin.close();
    fout.close();
    return 0;
}