Cod sursa(job #2632174)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 2 iulie 2020 14:01:07
Problema Trie Scor 55
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int x;

class nod{

    public:
    int nrfii,occ;
    nod *p[30];

    nod()
    {
        occ=nrfii=0;
        for(int i=0;i<30;i++) p[i]=NULL;
        //memset(p,0,sizeof(p));
    }
};

void Add(nod* root,string word,int k)
{
    if(k==word.size())
    {
        root->occ++;
        return;
    }

    int idx=word[k]-'a';

    if( root->p[idx] == NULL )
    {
        root->nrfii++;
        nod* vertex=new nod;
        root->p[idx]=vertex;
    }

    Add(root->p[idx],word,k+1);
}

nod* T;

bool Erase(nod* root,string word,int k)
{
    if(k==word.size())
    {
        root->occ--;
        if(root!=T && !root->occ && !root->nrfii)
        {
            delete root;
            return 1;
        }
        else return 0;
    }

    int idx=word[k]-'a';

    if( Erase( root->p[idx] , word, k+1) )
    {
        root->nrfii--;
        root->p[idx]=0;
        if( root!=T && !root->nrfii )
        {
            delete root;
            return 1;
        }
        else return 0;
    }
    else return 0;
}

int Prefix(nod* root,string word,int k)
{
    if(k==word.size()) return 0;
    int idx=word[k]-'a';

    if( root->p[idx] ) return 1+Prefix(root->p[idx],word,k+1);
    else return 0;
}

int Occurances(nod* root,string word,int k)
{
    if(k==word.size()) return root->occ;

    int idx=word[k]-'a';

    if( root->p[idx] ) return Occurances(root->p[idx],word,k+1);
    else return 0;
}

int main()
{
    nod* root=new nod;
    T=root;

    string S;

    while(f>>x>>S)
    {
        if(x==0) Add(root,S,0);
        else
        if(x==1) Erase(root,S,0);
        else
        if(x==2) g<<Occurances(root,S,0)<<'\n';
        else
        g<<Prefix(root,S,0)<<'\n';

    }

    return 0;
}