Cod sursa(job #2635756)

Utilizator Chirac_MateiChiriac Matei Chirac_Matei Data 15 iulie 2020 14:50:11
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin ("trie.in");
ofstream fout ("trie.out");
struct trieNod
{
    char val;
    int nr=0;
    map<char, trieNod*> cop;

    trieNod(char val)
    {
        this->val=val;
    }
    trieNod(){}
};
int t;
string line;
void add(string &s, trieNod *poz, int i)
{
    poz->nr++;

    if(s.size()==i)
        return;

    if(poz->cop.find(s[i]) == poz->cop.end())
        poz->cop[s[i]] = new trieNod(s[i]);

    add(s, poz->cop[s[i]], i+1);
}
void del(string &s, trieNod *poz, int i)
{
    poz->nr--;

    if(s.size()==i)
        return;

    del(s, poz->cop[s[i]], i+1);
}
int cnt(string &s, trieNod *poz, int i)
{
    if(s.size()==i)
    {
        int ans=poz->nr;
        for(auto it : poz->cop)
        {
            ans-=it.second->nr;
        }

        return ans;
    }


    if(poz->cop.find(s[i])==poz->cop.end())
        return 0;

    return cnt(s, poz->cop[s[i]], i+1);
}
int len(string &s, trieNod *poz, int i)
{
    if(poz->nr==0)
        return -1;
    if(s.size()==i)
        return 0;

    if(poz->cop.find(s[i])==poz->cop.end())
        return 0;

    return 1+len(s, poz->cop[s[i]], i+1);
}
int main()
{
    trieNod *root = new trieNod();
    while(fin)
    {
        getline(fin, line);
        if(line.empty())
            break;
        string s= line.substr(2, line.size());

        switch(line[0])
        {
            case '0':add(s, root, 0); break;
            case '1':del(s, root, 0); break;
            case '2':fout<<cnt(s, root, 0)<<'\n'; break;
            case '3':fout<<len(s, root, 0)<<'\n'; break;
        }
    }
    return 0;
}