Cod sursa(job #2665598)

Utilizator stefantagaTaga Stefan stefantaga Data 31 octombrie 2020 09:49:32
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.97 kb
#include <bits/stdc++.h>

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