Cod sursa(job #2988005)

Utilizator Diana_IonitaIonita Diana Diana_Ionita Data 3 martie 2023 11:53:39
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie
{
    int fr,nr;
    trie* f[26];
    trie()
    {
        memset(f, 0, sizeof f);
        fr = nr = 0;
    }
};
trie *T;
void Add(string s)
{
    trie *x=T;
    for(int i=0; i<s.size(); i++)
    {
        int y=s[i]-'a';
        if(!x->f[y])
        {
            x->f[y]=new trie;
        }
        x=x->f[y];
        x->nr++;
    }
    x->fr++;
}
void sterge(string s)
{
    trie *x=T;
    for(int i=0; i<s.size(); i++)
    {
        int y=s[i]-'a';
        x=x->f[y];
        x->nr--;
    }
    x->fr--;
}
int  numaracuv(string s)
{

    trie *x=T;
    for(int i=0; i<s.size(); i++)
    {

        int y=s[i]-'a';
        if(x->f[y]&&x->f[y]->nr)        x=x->f[y];
        else return 0;
    }
    return x->fr;
}
int prefix(string s)
{
    trie *x=T;
    int ok=0;
    for(int i=0; i<s.size(); i++)
    {
        int y=s[i]-'a';
        if(x->f[y]&&x->f[y]->nr)   x=x->f[y];
        else return ok;
        ok++;
    }
    return ok;
}
int main()
{
    int tip;
    string s;
    T=new trie;

    while(fin>>tip>>s)
    {
        //cout<<s;
        if(tip==0)
        {
            Add(s);
        }
        else if(tip==1)
        {
            sterge(s);

        }
        else if(tip==2)
        {
            fout<<numaracuv(s);
            fout<<'\n';
        }
        else
        {
            fout<<prefix(s);
            fout<<'\n';
        }
    }
    return 0;
}