Cod sursa(job #2802425)

Utilizator stefanvoicaVoica Stefan stefanvoica Data 18 noiembrie 2021 09:10:00
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <bits/stdc++.h>
#define int long long
#define dim 200006
#define mod 666013//1000000007
using namespace std;
ifstream fin ("trie.in");
ofstream fout("trie.out");
string s;

struct trie
{
    int nrc=0,ap=0;
    trie *kids[29];
    trie ()
    {
    for (int i=0;i<=26;i++)
        kids[i]=nullptr;
    }
};

trie* insert (trie *node,int index)
{
    if (node==nullptr)
        node=new trie;
    node->ap++;
    if (index==(int)s.size())
    {
        node->nrc++;
        return node;
    }
    node->kids[s[index]-'a']=insert(node->kids[s[index]-'a'],index+1);
    return node;
}

trie* sterge (trie *node,int index)
{
    node->ap--;
    if (index==(int)s.size())
        node->nrc--;
    else
    node->kids[s[index]-'a']=sterge(node->kids[s[index]-'a'],index+1);
    if (node->ap==0)
        node=nullptr;
    return node;
}

int numara (trie *node,int index)
{
    if (node==nullptr)
        return 0;
    if (index==(int)s.size())
        return node->nrc;
    return numara(node->kids[s[index]-'a'],index+1);
}

int bestpref(trie *node,int index)
{
    if (node==nullptr)
        return -1;
    if (index==(int)s.size())
        return 0;
    return 1+bestpref(node->kids[s[index]-'a'],index+1);
}

int32_t main()
{
    int t;
    trie *root=nullptr;
    while (fin>>t>>s)
    {
        if (t==0)
            root=insert(root,0);
        else    if (t==1)
            root=sterge(root,0);
        else    if (t==2)
            fout<<numara(root,0)<<'\n';
        else    fout<<bestpref(root,0)<<'\n';

    }
    return 0;
}