Cod sursa(job #2839923)

Utilizator Ionut10Floristean Ioan Ionut10 Data 26 ianuarie 2022 19:00:42
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>
#define ALF 26
#define DimMax 201001

using namespace std;

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

int op, N;
string s;
int nxt[DimMax][ALF], ap[DimMax], nrcuv[DimMax];

void op0 ( string s )
{
    int nod = 0;
    for ( char c: s )
    {
        if ( nxt[nod][c - 'a'] == 0 )
        {
            nxt[nod][c - 'a'] = ++N;
        }
        nod = nxt[nod][c - 'a'];
        ap[nod]++;
    }
    nrcuv[nod]++;
}

void op1 ( string s )
{
    int nod = 0;
    for ( char c: s )
    {
        nod = nxt[nod][c - 'a'];
        ap[nod]--;
    }
    nrcuv[nod]--;
}

void op2 ( string s )
{
    int nod = 0;
    for ( char c: s )
    {
        int tmp = nxt[nod][c - 'a'];
        if ( tmp == 0 || ap[tmp] <= 0 )
        {
            fout << 0 << '\n';
            return;
        }
        nod = tmp;
    }
    fout << nrcuv[nod] << '\n';
}

void op3 ( string s )
{
    int nod = 0; int lg = 0;
    for ( char c: s )
    {
        int tmp = nxt[nod][c - 'a'];
        if ( tmp == 0 || ap[tmp] <= 0 ) break;
        nod = tmp;
        lg++;
    }
    fout << lg << '\n';
}

int main()
{
    int nr = 0;
    while ( fin >> op >> s )
    {
        if ( op == 0 ) op0(s);
        else if ( op == 1 ) op1(s);
        else if ( op == 2 ) {op2(s); nr++;}
        else {op3(s);nr++;}
    }
    return 0;
}