Cod sursa(job #2964260)

Utilizator Mendea_IanisMendea Ianis Teodor Mendea_Ianis Data 12 ianuarie 2023 18:46:54
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.01 kb
#include <bits/stdc++.h>

using namespace std;

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

int op;

struct Trie{

    int cnt = 0;
    int howmany = 0;

    Trie* sons[26];

    Trie()
    {
        for(int i = 0;i<26;i++)
        {
            sons[i] = NULL;
        }
    }
};

Trie* root = new Trie();

string str;

void Insert(string &w,Trie* node,int pos)
{
    (*node).howmany++;

    if(pos == w.size())
    {
        (*node).cnt++;
        return;
    }

    if(node->sons[w[pos]-'a']==NULL)
    {
        node->sons[w[pos]-'a'] = new Trie();
    }

    Insert(w,node->sons[w[pos]-'a'],pos+1);
}
void Delete(string &w,Trie* node,int pos)
{
    (*node).howmany--;

    if(pos == w.size())
    {
        (*node).cnt--;
        return;
    }

    if(node->sons[w[pos]-'a']==NULL)
    {
        return;
    }

    Delete(w,node->sons[w[pos]-'a'],pos+1);
}

int Query1(string &w,Trie* node,int pos)
{
    if(pos == w.size())
    {
        return (*node).cnt;
    }

    if(node->sons[w[pos]-'a']==NULL)
    {
        return 0;
    }

    return Query1(w,node->sons[w[pos]-'a'],pos+1);
}

int Query2(string &w,Trie* node,int pos)
{
    if(pos == w.size())
    {
        return w.size();
    }
    if(node->sons[w[pos]-'a']==NULL || node->sons[w[pos]-'a']->howmany == 0)
    {
        return pos;
    }

    return Query2(w,node->sons[w[pos]-'a'],pos+1);
}

int main()
{
    while(fin>>op)
    {
        fin>>str;
        if(op == 0)
        {
            Insert(str,root,0);
        }
        else{
            if(op == 1)
            {
                Delete(str,root,0);
            }
            else{
                if(op == 2)
                {
                    fout<<Query1(str,root,0)<<'\n';
                }
                else{
                    if(op == 3)
                    {
                        fout<<Query2(str,root,0)<<'\n';
                    }
                }
            }
        }
    }
}