Cod sursa(job #3146874)

Utilizator Alex_BerbescuBerbescu Alexandru Alex_Berbescu Data 22 august 2023 23:07:15
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <bits/stdc++.h>
using namespace std;
string sir;

struct trie
{
    int nrcuv = 0, fr = 0;
    trie * kinder[30];
    trie()
    {
        for(int i = 0; i <= 26; ++i)
        {
            kinder[i] = NULL;
        }
    }

};
trie * add(trie * nod, int val)
{
    if(nod == NULL)
    {
        nod = new trie;
    }
    nod->fr++;
    if(val == sir.size())
    {
        nod->nrcuv++;
        return nod;
    }
    nod->kinder[sir[val] - 'a'] = add(nod->kinder[sir[val] - 'a'], val + 1);
    return nod;
}
trie * del(trie * nod, int val)
{
    nod->fr--;
    if(val == sir.size())
    {
        nod->nrcuv--;

    }
    else
    {
        nod->kinder[sir[val] - 'a'] = del(nod->kinder[sir[val] - 'a'], val + 1);
    }
    if(nod->fr == 0)
    {
        nod = NULL;

    }
    return nod;
}
int freq(trie * nod, int val)
{
    if(nod == NULL)
    {
        return 0;
    }
    if(val == sir.size())
    {
        return nod->nrcuv;
    }
    return freq(nod->kinder[sir[val] - 'a'], val + 1);
}
int lcp(trie * nod, int val)
{
    if(nod == NULL)
    {
        return -1;
    }
    if(val == sir.size())
    {
        return 0;
    }
    return 1 + lcp(nod->kinder[sir[val] - 'a'], val + 1);
}
int tip;
trie *p = NULL;
ifstream fin("trie.in");
ofstream fout("trie.out");
int32_t main(int argc, char * argv[])
{
    while(fin >> tip >> sir)
    {
        if(tip == 0)
        {
            p = add(p, 0);
        }
        if(tip == 1)
        {
            p = del(p, 0);
        }
        if(tip == 2)
        {
            fout << freq(p, 0) << '\n';
        }
        if(tip == 3)
        {
            fout << lcp(p, 0) << '\n';
        }
    }
    return 0;
}