Cod sursa(job #3040583)

Utilizator CobzaruAntonioCobzaru Paul-Antonio CobzaruAntonio Data 30 martie 2023 09:55:40
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.85 kb
#include <fstream>

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