Cod sursa(job #2523156)

Utilizator Rares31100Popa Rares Rares31100 Data 13 ianuarie 2020 19:58:02
Problema Trie Scor 5
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.96 kb
#include <bits/stdc++.h>

using namespace std;

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

int n;
string cuv;

typedef struct Trie* nod;
struct Trie
{
    int nrCuv=0;
    nod alf[26];
};
nod rad;

void adauga(string cuv)
{
    nod p=rad;
    p->nrCuv++;

    for(int i=0;i<cuv.size();i++)
        if(p->alf[ cuv[i]-'a' ]!=NULL)
        {
            p=p->alf[ cuv[i]-'a' ];
            p->nrCuv++;
        }
        else
        {
            nod c=new Trie;
            c->nrCuv++;
            p->alf[ cuv[i]-'a' ]=c;
            p=c;
        }
}

void sterge(string cuv,nod p=rad,int poz=0)
{
    if(poz==cuv.size())
        return;

    p->nrCuv--;
    if(p->alf[ cuv[poz]-'a' ]!=NULL)
    {
        bool ok=0;
        if(p->alf[ cuv[poz]-'a']->nrCuv==1 )
            ok=1;

        sterge(cuv,p->alf[ cuv[poz]-'a' ],poz+1);

        if(ok)
            p->alf[ cuv[poz]-'a' ]=NULL;
    }

    if(p->nrCuv==0 && p!=rad)
        delete p;

    cout<<1<<' ';
}

int aparitii(string cuv)
{
    nod p=rad;

    for(int i=0;i<cuv.size();i++)
        if(p->alf[ cuv[i]-'a' ]==NULL)
            return 0;
        else
            p=p->alf[ cuv[i]-'a' ];

    int nr=p->nrCuv;
    for(int i=0;i<='z'-'a';i++)
        if(p->alf[i])
            nr-=p->alf[i]->nrCuv;

    return nr;
}

int prefix(string cuv)
{
    nod p=rad;

    for(int i=0;i<cuv.size();i++)
        if(p->alf[ cuv[i]-'a' ]==NULL)
            return i;
        else
            p=p->alf[ cuv[i]-'a' ];

    return cuv.size();
}

int main()
{
    rad=new Trie;

    while(in)
    {
        in>>n>>cuv;

        if(!in)
            break;

        int nr;
        switch(n)
        {
            case 0:adauga(cuv);break;
            case 1:sterge(cuv);break;
            case 2:out<<aparitii(cuv)<<'\n';break;
            case 3:out<<prefix(cuv)<<'\n';break;
            default:break;
        }
    }

    return 0;
}