Cod sursa(job #2636773)

Utilizator etienAndrone Stefan etien Data 19 iulie 2020 20:23:50
Problema Trie Scor 5
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.06 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie
{
    char c;
    int nrcuv,nrfii;
    trie *v[27];
    trie()
    {
        for(int i=0; i<27; ++i)
            v[i]=NULL;
        nrcuv=0;
        nrfii=0;
    }
};

trie *prim;
void Insert(string s)
{
    trie *t=prim;
    for(int p=0; p<(int)s.size(); p++)
    {
        if(t->v[s[p]-'a'+1]!=NULL)
        {
            t=t->v[s[p]-'a'+1];
        }
        else
        {
            trie *t2=new trie;
            t->v[s[p]-'a'+1]=t2;
            t->nrfii++;
            t2->c=s[p];
            t=t2;
        }
    }
    t->nrcuv++;
}
bool Delete(string s,trie *t,int p)
{
    if(p==s.size())
    {
        if(t->nrfii==0&&t->nrcuv==1)
        {
            delete t;
            return true;
        }
        else if(t->nrfii==0)
        {
            t->nrcuv--;
            return false;
        }
        return false;
    }
    if(Delete(s,t->v[s[p]-'a'+1],p+1))
        {
            t->nrfii--;
            t->v[s[p]-'a'+1]=NULL;
        }
    if(t->nrcuv==0&&t->nrfii==0&&t!=prim)
    {
        delete t;
        return true;
    }
    return false;
}
void nrap(string s)
{
    trie *t=new trie;
    t=prim;
    for(int p=0; p<(int)s.size(); p++)
    {
        if(t->v[s[p]-'a'+1]!=NULL)
        {
            t=t->v[s[p]-'a'+1];
        }
        else
        {
            fout<<0<<"\n";
            return;
        }
    }
    fout<<t->nrcuv<<"\n";
}
void prefcom(string s)
{
    trie *t=prim;
    int cnt=0;
    for(int p=0; p<(int)s.size(); p++)
    {
        if(t->v[s[p]-'a'+1]!=NULL)
        {
            t=t->v[s[p]-'a'+1];
            cnt++;
        }
        else break;
    }
    fout<<cnt<<"\n";
}
int main()
{
    string s;
    int op;
    prim=new trie;
    while(fin>>op>>s)
    {
        if(op==0)
            Insert(s);
        else if(op==1)
            Delete(s,prim,0);
        else if(op==2)
            nrap(s);
        else prefcom(s);
    }
}