Cod sursa(job #2972624)

Utilizator sandry24Grosu Alexandru sandry24 Data 29 ianuarie 2023 21:06:50
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
#include <bits/stdc++.h>
using namespace std;
 
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pi;
#define pb push_back
#define mp make_pair
#define f first
#define s second

struct Trie {
    int cnt, nrchildren;
    Trie *child[26];
    Trie(){
        cnt = nrchildren = 0;
        memset(child, 0, sizeof(child));
    }
};

Trie *T = new Trie;

void ins(Trie *node, char *s){
    if(*s == '\n'){
        node->cnt++;
        return;
    }
    if(node->child[*s-48] == 0){
        node->child[*s-48] = new Trie;
        node->nrchildren++;
    }
    ins(node->child[*s-48], s+1);
}

int del(Trie *node, char *s){
    if(*s == '\n')
        node->cnt--;
    else if(del(node->child[*s-48], s+1)){
        node->child[*s-48] = 0;
        node->nrchildren--;
    }
    if(node->nrchildren == 0 && node->cnt == 0 && node != T){
        delete node;
        return 1;
    }
}

int cnt(Trie *node, char *s){
    if(*s == '\n')
        return node->cnt;
    if(node->child[*s-48])
        return cnt(node->child[*s-48], s+1);
    return 0;
}

int prefix(Trie *node, char *s, int k){
    if(*s == '\n' || node->child[*s-48] == 0)
        return k;
    return prefix(node->child[*s-48], s+1, k+1);
}

void solve(){
    string s;
    getline(cin >> ws, s);
    while(!feof(stdin)){
        int t = s[0] - 48;
        string cuv = string(s.begin()+2, s.end());
        char *str = new char[s.size()+1];
        strcpy(str, s.c_str());
        switch(t){
        case 0: ins(T, str); break;
        case 1: del(T, str); break;
        case 2: cnt(T, str); break;
        case 3: prefix(T, str, 0); break;
        }
        getline(cin >> ws, s);
    }
}  
 
int main(){
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);
    ios::sync_with_stdio(0); cin.tie(0);
    int t = 1;
    //cin >> t;
    while(t--){
        solve();
    }
}