Cod sursa(job #2885530)

Utilizator IATI2019Iati Shumen IATI2019 Data 6 aprilie 2022 10:36:19
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.39 kb
#include <bits/stdc++.h>
#define debug(x) cerr << #x << " " << x << "\n"
#define debugs(x) cerr << #x << " " << x << " "

using namespace std;
typedef long long ll;
typedef pair <int, int> pii;
typedef pair <long double, pii> muchie;

const ll NMAX = 150001;
const ll VMAX = 26;
const ll INF = (1LL << 55);
const ll MOD = 90000000000000001;
const ll BLOCK = 1000000;
const ll base = 1000000001;
const ll nr_of_bits = 1000;

struct Node{
    int pref, val;
    int nxt[26];
    void init(){
        pref = val = 0;
        for(int i = 0; i < 26; i++)
            nxt[i] = -1;
    }
}trie[NMAX * 20];

int cnt = 0;
int root;

string my;

void baga(int node, int k){
    if(k == my.size()){
        trie[node].val++;
        trie[node].pref++;
        return;
    }
    int c = my[k] - 'a';
    trie[node].pref++;
    if(trie[node].nxt[c] == -1){
        trie[++cnt].init();
        trie[node].nxt[c] = cnt;
    }
    baga(trie[node].nxt[c], k + 1);
}

void sterge(int node, int k){
    if(k == my.size()){
        trie[node].val--;
        trie[node].pref--;
        return;
    }
    int c = my[k] - 'a';
    trie[node].pref--;
    if(trie[node].nxt[c] == -1){
        trie[++cnt].init();
        trie[node].nxt[c] = cnt;
    }
    sterge(trie[node].nxt[c], k + 1);
}

int numara(int node, int k){
    if(k == my.size()){
        return trie[node].val;
    }
    int c = my[k] - 'a';
    if(trie[node].nxt[c] == -1){
        trie[++cnt].init();
        trie[node].nxt[c] = cnt;
    }
    return numara(trie[node].nxt[c], k + 1);
}

int lp(int node, int k){
    if(k == my.size()){
        return k;
    }
    int c = my[k] - 'a';
    if(trie[node].nxt[c] == -1 || trie[trie[node].nxt[c]].pref == 0){
        return k;
    }
    return lp(trie[node].nxt[c], k + 1);
}

int main() {
    ifstream cin("trie.in");
    ofstream cout("trie.out");
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    trie[0].init();
    int c;
    string s;
    int cnt = 0;
    while(cin >> c && cin >> s){
        if(c == 0){
            my = s;
            baga(0, 0);
        }else if(c == 1){
            my = s;
            sterge(0, 0);
        }else if(c == 2){
            my = s;
            cout << numara(0, 0) << "\n";
        }else{
            my = s;
            cout << lp(0, 0) << "\n";
        }
    }
    return 0;
}