Cod sursa(job #2746514)

Utilizator valentinchipuc123Valentin Chipuc valentinchipuc123 Data 27 aprilie 2021 23:17:59
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("trie.in");
ofstream g("trie.out");

int operation;
string s;

struct trie
{
    int ct;
    int nrfii;

    trie* fii[27];

    trie()
    {
        ct=0;
        nrfii=0;
        for(int i=1; i<=26; i++)
            fii[i]=0;
    }
};

trie *myTrie=new trie;

void add(trie *nod,int ind)
{
    if( ind==s.length() )
    {
        ++nod->ct;
        return;
    }
    int ch=s[ind]-'a'+1;

    if( nod->fii[ch]==NULL )
    {
        ++nod->nrfii;
        nod->fii[ch]=new trie;
    }
    add(nod->fii[ch],ind+1);
}

bool cut(trie *nod,int ind)
{
    if( ind==s.length() )
        --nod->ct;
    else if( cut(nod->fii[s[ind]-'a'+1],ind+1) )
    {
        --nod->nrfii;
        nod->fii[s[ind]-'a'+1]=0;
    }

    if( nod!=myTrie && nod->ct==0 && nod->nrfii==0 )
    {
        delete nod;
        return 1;
    }

    return 0;
}

int get(trie *nod,int ind)
{
    if( ind==s.length() )
        return nod->ct;

    if( nod->fii[s[ind]-'a'+1]==NULL )
        return 0;

    return get(nod->fii[s[ind]-'a'+1],ind+1);
}

int maxpref(trie *nod,int ind)
{
    if( ind==s.length() )
        return 0;

    if( nod->fii[s[ind]-'a'+1]==NULL )
        return 0;

    return 1+maxpref(nod->fii[s[ind]-'a'+1],ind+1);
}

int main()
{
    while(f>>operation>>s)
    {
        if( operation==0 )
        {
            add(myTrie,0);
        }

        if( operation==1 )
        {
            cut(myTrie,0);
        }

        if( operation==2 )
        {
            g<<get(myTrie,0)<<'\n';
        }

        if( operation==3 )
        {
            g<<maxpref(myTrie,0)<<'\n';
        }
    }
}