Cod sursa(job #2523325)

Utilizator Rares31100Popa Rares Rares31100 Data 13 ianuarie 2020 22:11:09
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <bits/stdc++.h>

using namespace std;

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

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

void adauga(string cuv)
{
    nod p=rad;

    for(auto lit:cuv)
        if(p->alf[ lit-'a' ]!=NULL)
        {
            p=p->alf[ lit-'a' ];
            p->nrCuv++;
        }
        else
        {
            nod add=new Trie;
            add->nrCuv=1;
            p->alf[ lit-'a' ]=add;
            p=add;
        }
}

void sterge(string cuv)
{
    nod p=rad;

    int poz=0;
    while( poz<cuv.size() && p->alf[ cuv[poz]-'a' ]!=NULL && p->alf[ cuv[poz]-'a' ]->nrCuv > 1 )
    {
        p=p->alf[ cuv[poz]-'a' ];
        p->nrCuv--;
        poz++;
    }

    if(poz==cuv.size())
        return;

    p->alf[ cuv[poz]-'a' ]=NULL;
}

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

    for(auto lit:cuv)
        if(p->alf[ lit-'a' ]==NULL)
            return 0;
        else
            p=p->alf[ lit-'a' ];

    int nr=p->nrCuv;

    for(int i=0;i<=25;i++)
        if(p->alf[i]!=NULL)
            nr-=p->alf[i]->nrCuv;

    return nr;
}

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

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

    return (int)cuv.size();
}

int main()
{
    rad=new Trie;

    int c;
    string cuv;

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

        if(!in)
            return 0;

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

    return 0;
}