Cod sursa(job #3175236)

Utilizator dobreraduDobre Radu Fabian dobreradu Data 25 noiembrie 2023 14:27:28
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");

struct Nod{
    char lit;
    int frcv, cuv_dupa;
    int next[26];
};
int arb_size;
vector <Nod> arb;
void adaug( string s ){
    int nod_curr = 0;
    for( int i = 0; i < s.size(); i++ ){
        arb[nod_curr].cuv_dupa++;
        if( !arb[nod_curr].next[s[i]-'a'] ){
            arb[nod_curr].next[s[i]-'a'] = ++arb_size;
            nod_curr = arb[nod_curr].next[s[i]-'a'];
            arb[nod_curr].lit = s[i];
        }
        else
            nod_curr = arb[nod_curr].next[s[i]-'a'];
    }
    arb[nod_curr].cuv_dupa++;
    arb[nod_curr].frcv++;
}
void sterg( string s ){
    int nod_curr = 0;
    for( int i = 0; i < s.size(); i++ ){
        arb[nod_curr].cuv_dupa--;
        nod_curr = arb[nod_curr].next[s[i]-'a'];
    }
    arb[nod_curr].cuv_dupa--;
    arb[nod_curr].frcv--;
}
int queryCount( string s ){
    int nod_curr = 0;
    for( int i = 0; i < s.size(); i++ )
        nod_curr = arb[nod_curr].next[s[i]-'a'];
    return arb[nod_curr].frcv;
}
int queryPrefix( string s ){
    int nod_curr = 0;
    for( int i = 0; i < s.size(); i++ ){
        if( !arb[nod_curr].cuv_dupa )
            return i;
        nod_curr = arb[nod_curr].next[s[i]-'a'];
    }
    return s.size();
}
int main()
{
    int op;
    string cuv;
    while( in >> op >> cuv ){
        if( op == 0 )
            adaug(cuv);
        else if( op == 1 )
            sterg(cuv);
        else if( op == 2 )
            out << queryCount(cuv) << "\n";
        else
            out << queryPrefix(cuv) << "\n";
    }
    return 0;
}