Cod sursa(job #3330098)

Utilizator apoputoaievladVlad Cristian Apoputoaie apoputoaievlad Data 17 decembrie 2025 16:07:40
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

struct Nod
{
    Nod *v[26];
    int cntfii, cnt;
    Nod ()
    {
        for(int i = 0; i <= 25; i++)
            v[i] = NULL;
        cntfii = cnt = 0;
    }
}*root = new Nod;

void Insert(Nod *n, string &a, int p)
{
    if(p==a.size())
    {
        n->cnt++;
        return;
    }
    if(n->v[a[p]-'a']==NULL)
    {
        n->v[a[p]-'a'] = new Nod;
        n->cntfii++;
    }
    Insert(n->v[a[p]-'a'],a,p+1);
}

void Erase(Nod *n, string &a, int p)
{
    if(p==a.size())
    {
        n->cnt--;
        return;
    }
    if(n->v[a[p]-'a']==NULL)
    {
        return;
    }
    Erase(n->v[a[p]-'a'],a,p+1);
    if(n->v[a[p]-'a']->cnt==0 && n->v[a[p]-'a']->cntfii==0)
    {
        delete n->v[a[p]-'a'];
        n->v[a[p]-'a']=NULL;
        n->cntfii--;
    }
}

int Count(Nod *n, string &a, int p)
{
    if(p==a.size())
    {
        return n->cnt;
    }
    if(n->v[a[p]-'a']==NULL)
    {
        return 0;
    }
    return Count(n->v[a[p]-'a'], a, p+1);
}

int Lcp(Nod *n, string &a, int p)
{
    if(p==a.size())
    {
        return p;
    }
    if(n->v[a[p]-'a']==NULL)
    {
        return p;
    }
    return Lcp(n->v[a[p]-'a'], a, p+1);
}

int main()
{
    int q, task;
    string s;
    while(fin>>task>>s)
    {
        if(task == 0)
        {
            Insert(root,s,0);
        }
        else if(task == 1)
        {
            Erase(root,s,0);
        }
        else if(task == 2)
        {
            fout << Count(root,s,0) << "\n";
        }
        else if(task == 3)
        {
            fout << Lcp(root,s,0) << "\n";
        }
    }
    return 0;
}