Cod sursa(job #2984892)

Utilizator CobzaruAntonioCobzaru Paul-Antonio CobzaruAntonio Data 25 februarie 2023 09:46:27
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 kb
#include <fstream>

using namespace std;
ifstream cin ("trie.in");
ofstream cout ("trie.out");
struct nod
{
    int cnt;
    int ult;
    nod *f[30];
};
nod* creeaza ()
{
    nod *nou = new nod;
    int i;
    nou->cnt = 0;
    nou->ult = 0;
    for (i=0;i<26;i++)
        nou->f[i] = NULL;
    return nou;
}
void adauga (nod *r,string s)
{
    int i;
    for (i=0;s[i];i++)
    {
        char x = s[i];
        int v = x - 'a';
        if (!r->f[v])
            r->f[v] = creeaza();
        r = r->f[v];
        r->cnt++;
    }
    r->ult++;
}
int app (nod *r,string s)
{
    int i;
    for (i=0;s[i];i++)
    {
        char x = s[i];
        int v = x - 'a';
        if (!r->f[v])
            return 0;
        r = r->f[v];
        if (r->cnt == 0)
            return 0;
    }
    return r->ult;
}
int lcp (nod *r,string s)
{
    int i;
    int rasp = 0;
    for (i=0;s[i];i++)
    {
        char x = s[i];
        int v = x - 'a';
        if (!r->f[v])
            return rasp;
        r = r->f[v];
        if (r->cnt == 0)
            return rasp;
        rasp++;
    }
    return rasp;
}
void sterge (nod *r,string s)
{
    int i;
    for (i=0;s[i];i++)
    {
        char x = s[i];
        int v = x - 'a';
        r = r->f[v];
        r->cnt--;
    }
    r->ult--;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int i;
    int t;
    nod *rad = creeaza();
    while (cin >> t)
    {
        string s;
        cin >>  s;
        if (t == 0)
            adauga(rad,s);
        else if (t==1)
            sterge (rad,s);
        else if (t==2)
            cout << app(rad,s) << '\n';
        else if (t==3)
            cout << lcp(rad,s) << '\n';
    }
    return 0;
}