Cod sursa(job #2369465)

Utilizator YouDontNeedMyNameJurcut Paul YouDontNeedMyName Data 5 martie 2019 23:41:05
Problema Trie Scor 100
Compilator cpp-32 Status done
Runda Arhiva educationala Marime 1.77 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct trie{
    trie *fii[26];
    int nr_ap;
    int nr_fii;
    trie()
    {
        nr_ap=0;
        nr_fii=0;
        memset(fii,0,sizeof(fii));
    }
};
trie *t=new trie;
void inserare(string &v,trie *p, int poz)
{
    if(v.size()==poz)
    {
        p->nr_ap++;
        return;
    }
    if(!p->fii[v[poz]-'a'])
    {
        p->fii[v[poz]-'a']=new trie;
        p->nr_fii++;
    }
    inserare(v,p->fii[v[poz]-'a'],poz+1);
}
bool del(string &v,trie *p,int poz)
{
    if(v.size()==poz)
    {
        p->nr_ap--;
    }
    else if(del(v,p->fii[v[poz]-'a'],poz+1))
    {
        p->nr_fii--;
        p->fii[v[poz]-'a']=NULL;
    }
    if(p->nr_ap==0 && p->nr_fii==0 && p!=t)
    {
        delete p;
        return 1;
    }
    return 0;
}
int de_cate_ori_o_aparut(string &v,trie *p,int poz)
{
    if(v.size()==poz)
    {
        return p->nr_ap;
    }
    else
    {
        if(!p->fii[v[poz]-'a'])
            return 0;
        else
            return de_cate_ori_o_aparut(v,p->fii[v[poz]-'a'],poz+1);
    }
}
int lg_max(string &v)
{
    trie *nod=t;
    for(int i=0; i<v.size(); i++)
    {
        if(!nod->fii[v[i]-'a'])
            return i;
        nod=nod->fii[v[i]-'a'];
    }
    return v.size();
}
string a;
int x;
int main()
{
    while(!in.eof())
    {
        in >> x;
        in >> a;
        if(!in.eof())
        {
            if(x==0)
                inserare(a,t,0);
            else if(x==1)
                del(a,t,0);
            else if(x==2)
                out << de_cate_ori_o_aparut(a,t,0) << '\n';
            else
                out << lg_max(a) << '\n';
        }
    }
    return 0;
}