Cod sursa(job #2665585)

Utilizator stefantagaTaga Stefan stefantaga Data 31 octombrie 2020 08:51:28
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct trie
{
    int nr,nrcuv;
    vector <int> v;
    trie()
    {
        nr=nrcuv=0;
        v.resize(26);
    }
};
vector <trie> arb;
void adauga (string s)
{
    int j,nod=0;
    for (j=0;j<s.size();j++)
    {
        if (arb[nod].v[s[j]-'a']==0)
        {
            arb.push_back(trie());
            arb[nod].v[s[j]-'a']=arb.size()-1;
        }
        nod=arb[nod].v[s[j]-'a'];
        arb[nod].nr++;
    }
    arb[nod].nrcuv++;
}
void sterge (string s)
{
    int j,nod=0;
    for (j=0;j<s.size();j++)
    {
        nod=arb[nod].v[s[j]-'a'];
        arb[nod].nr--;
    }
    arb[nod].nrcuv--;
}
int nrcuv(string s)
{
    int nod=0,j;
    for (j=0;j<s.size();j++)
    {
        nod=arb[nod].v[s[j]-'a'];
        if (arb[nod].nr==0)
        {
            return 0;
        }
    }
    return arb[nod].nrcuv;
}
int celmailungprefix (string s)
{
    int nod=0,j;
    for (j=0;j<s.size();j++)
    {
        nod=arb[nod].v[s[j]-'a'];
        if (arb[nod].nr==0)
        {
            return j;
        }
    }
    return s.size();
}
int x;
string s;
int main()
{
    arb.push_back(trie());
    while (f>>x>>s)
    {
        if (x==0)
        {
            adauga(s);
        }
        else
        if (x==1)
        {
            sterge(s);
        }
        else
        if (x==2)
        {
            g<<nrcuv(s)<<'\n';
        }
        else
        {
            g<<celmailungprefix(s)<<'\n';
        }
    }
    return 0;
}