Cod sursa(job #2369370)

Utilizator YouDontNeedMyNameJurcut Paul YouDontNeedMyName Data 5 martie 2019 22:44:11
Problema Trie Scor 55
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <bits/stdc++.h>

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