Cod sursa(job #2632177)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 2 iulie 2020 14:05:51
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 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[26];

    nod()
    {
        occ=nrfii=0;
        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--;
    else
    {
       int idx=word[k]-'a';
       if(Erase(root->p[idx],word,k+1))
       {
           root->nrfii--;
           root->p[idx]=0;
       }
    }

    if( root!=T && !root->nrfii && !root->occ )
    {
        delete root;
        return 1;
    }
    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;
}