Cod sursa(job #2907439)

Utilizator DauCuDalta43Diaconu Razvan DauCuDalta43 Data 30 mai 2022 11:26:04
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#include <bits/stdc++.h>
using namespace std;

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

struct Nod
{
    int fr;
    int nrprefix;
    Nod *leg[26];
    Nod()
    {
        fr=nrprefix=0;
        for(int i=0;i<=26;i++)
            leg[i]=NULL;
    }
};

class Trie
{
protected:
    Nod *rad;
public:
    Trie()
    {
        rad=new Nod;
    }

    void Add(string w)
    {
        int i,j;
        Nod *p,*q;
        p=rad;
        for(i=0;i<w.size();i++)
        {
            j=w[i]-'a';
            p->nrprefix++;
            if(p->leg[j]==NULL)
            {
                q=new Nod;
                p->leg[j]=q;
            }
            p=p->leg[j];
        }
        p->nrprefix++;
        p->fr++;
    }

    void Del(string w)
    {
        int i,j;
        Nod *p;
        p=rad;
        for(i=0;i<w.size();i++)
        {
            j=w[i]-'a';
            p->nrprefix--;
            p=p->leg[j];
        }
        p->nrprefix--;
        p->fr--;
    }

    int NrAp(string w)
    {
        int i,j;
        Nod *p;
        p=rad;
        for(i=0;i<w.size();i++)
        {
            j=w[i]-'a';
            if(p->leg[j]==NULL)return 0;
            p=p->leg[j];
        }
        return p->fr;
    }

    int Prefix(string w)
    {
        int i,j;
        Nod *p;
        p=rad;
        for(i=0;i<w.size();i++)
        {
            j=w[i]-'a';
            if(p->nrprefix==0)return i-1;
            if(p->leg[j]==NULL)return i;
            p=p->leg[j];
        }
        return w.size();
    }
};

int main()
{
    Trie T;
    int n,op;
    string cuv;
    while(fin>>op>>cuv)
    {
        if(op==0)T.Add(cuv);
        else if(op==1)T.Del(cuv);
        else if(op==2)fout<<T.NrAp(cuv)<<"\n";
        else if(op==3)fout<<T.Prefix(cuv)<<"\n";
    }

    return 0;
}