Cod sursa(job #3165694)

Utilizator Horia_haivasHaivas Horia Horia_haivas Data 6 noiembrie 2023 19:09:21
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.19 kb
/*
    "care a facut teste cu Lattice reduction attack e ciudat"
    "linistiti va putin"
    - 2023 -
*/
#include<bits/stdc++.h>
#define debug(x) cerr << #x << " " << x << "\n"
#define debugs(x) cerr << #x << " " << x << " "
#pragma GCC optimize("Ofast")

using namespace std;

struct Node
{
    int freq;
    int traffic;
    int muchii[26];
};

vector<Node> trie;

void ins(string s, int pos, Node &node)
{
    node.traffic++;
    //debug(s);
    //debug(pos);
    //debug(node.traffic);
    if (node.muchii[s[pos]-'a'+1]==0)
    {
        trie.push_back({0,0,0});
        node.muchii[s[pos]-'a'+1]=trie.size()-1;
    }
    if (pos!=(s.size()-1))
    ins(s,pos+1,trie[node.muchii[s[pos]-'a'+1]]);
    else
    node.freq++;
}

void ers(string s, int pos, Node &node)
{
     node.traffic--;
     if (pos!=(s.size()-1))
     ers(s,pos+1,trie[node.muchii[s[pos]-'a'+1]]);
     else
     node.freq--;
}

int ans;

void app(string s, int pos, Node node)
{
    if (pos!=(s.size()-1) && node.muchii[s[pos]-'a'+1]!=0)
    app(s,pos+1,trie[node.muchii[s[pos]-'a'+1]]);
    else
    {
        ans=node.freq;
        return;
    }
}

int lungime;

void lgpref(string s, int pos, Node node)
{
    if (node.traffic>1)
    lungime++;
    else
    return;
    if (pos!=(s.size()-1))
    lgpref(s,pos+1,trie[node.muchii[s[pos]-'a'+1]]);
    else
    return;
}

int main()
{
    ifstream fin("trie.in");
    ofstream fout("trie.out");
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int type;
    string s;
    trie.push_back({0,0,0});
    while (fin >> type  >> s)
    {
        if (type==0)
        {
            ins(s,0,trie[0]);
        }
        if (type==1)
        {
            ers(s,0,trie[0]);
        }
        if (type==2)
        {
            ans=0;
            app(s,0,trie[0]);
            fout << ans << "\n";
        }
        if (type==3)
        {
            lungime=0;
            ans=0;
            app(s,0,trie[0]);
            if (ans==0)
            {
                ins(s,0,trie[0]);
                lgpref(s,0,trie[0]);
                ers(s,0,trie[0]);
            }
            else
            {
                lgpref(s,0,trie[0]);
            }
            fout << lungime << "\n";
        }
    }
}