Cod sursa(job #2712351)

Utilizator stefantagaTaga Stefan stefantaga Data 25 februarie 2021 17:55:15
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct Node
{
    int val=0;
    int active_sons=0;
    Node *v[27];
    Node()
    {
        val=active_sons=0;
        for (int j=0;j<=26;j++)
        {
            v[j]=nullptr;
        }
    }
}*Trie = new Node;
void update(Node *Tree,char *word,int litere_ramase,int val)
{
    if (litere_ramase==0)
    {
        Tree->val+=val;
        return;
    }
    int now=(*word-'a');
    if (Tree->v[now]==nullptr)
    {
        Tree->active_sons++;
        Tree->v[now]=new Node;
    }
    update (Tree->v[now],word+1,litere_ramase-1,val);
    if (val==-1)
    {
        Node *Son=Tree->v[now];
        if ((Son->val)==0&&Son->active_sons==0)
        {
            delete(Son);
            Tree->active_sons--;
            Tree->v[now]=nullptr;
        }
    }
}
int querycuvant(Node *Tree,char *word,int litere_ramase)
{
    if (litere_ramase==0)
    {
        return Tree->val;
    }
    int now=(*word-'a');
    if (Tree->v[now]==nullptr)
    {
        return 0;
    }
    return querycuvant(Tree->v[now],word+1,litere_ramase-1);
}
int LCP (Node *Tree, char *word, int litere_ramase,int cur_level)
{
    if (litere_ramase==0)
    {
        return cur_level;
    }
    int now=(*word-'a');
    if (Tree->v[now]==nullptr)
    {
        return cur_level;
    }
    return LCP(Tree->v[now],word+1,litere_ramase-1,cur_level+1);
}
int x,n;
char s[25];
int main()
{
    Trie->val=1;
    while (f>>x>>s)
    {
        n=strlen(s);
        if (x==0)
        {
            update(Trie,s,n,1);
        }
        else
        if (x==1)
        {
            update(Trie,s,n,-1);
        }
        else
        if (x==2)
        {
            g<<querycuvant(Trie,s,n)<<'\n';
        }
        else
        {
            g<<LCP(Trie,s,n,0)<<'\n';
        }
    }
    return 0;
}