Cod sursa(job #3347763)

Utilizator moloDaniMolodet Andrei Daniel moloDani Data 18 martie 2026 11:19:30
Problema Xor Max Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <fstream>
#include <string>

using namespace std;

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

const int mxL = 20, mxC = 1e5 + 1, mxN = mxL * mxC + 1;

int trie[mxN][26]; //26 de litere in alfabet
int cnt[mxN], endw[mxN], nxt = 1;

void add(string &a){
    int nod = 1;
    for(char c : a){
        int v = c - 'a';
        if(!trie[nod][v])
            trie[nod][v] = ++nxt;
        nod = trie[nod][v];
        cnt[nod]++;
    }

    endw[nod]++;
}

void remove(string &a){
    int nod = 1;
    for(char c : a){
        int v = c - 'a';
        if(!trie[nod][v]) return;
        nod = trie[nod][v];
        cnt[nod]--;
    }

    endw[nod]--;
}

int countWord(string &a){
    int nod = 1;
    for(char c : a){
        int v = c - 'a';
        if(!trie[nod][v]) return 0;
        nod = trie[nod][v];
    }

    return endw[nod];
}

int prefix(string &a){
    int nod = 1, len = 0;
    for(char c : a){
        int v = c - 'a';
        if(!trie[nod][v] || !cnt[trie[nod][v]]) break;
        nod = trie[nod][v];
        len++;
    }

    return len;
}

int main(){
    int q;
    string aux;
    while(fin >> q){
        fin >> aux;
        if(q == 0)
            add(aux);
        else if(q == 1)
            remove(aux);
        else if(q == 2)
            fout << countWord(aux) << "\n";
        else
            fout << prefix(aux) << "\n";
    }
}