Cod sursa(job #2339788)

Utilizator AlexTheDagonBogdan Tudor AlexTheDagon Data 9 februarie 2019 12:13:51
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <iostream>
#include <bits/stdc++.h>
using namespace std;

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

struct node {
    int nr_cuv;
    char nr_fii;
    node* fiu[26];
    node(){
        nr_cuv = 0;
        nr_fii = 0;
        memset(fiu, 0, sizeof(fiu));
    }
};

node* root;
char cuv[50];
int q,op;

void add(node* T, char* s){
    if(*s == 0){
        T -> nr_cuv++;
        return;
    }
    if(T -> fiu[*s - 'a'] == 0){
        T -> fiu[*s - 'a'] = new node;
        T -> nr_fii++;
    }
    add(T -> fiu[*s - 'a'], s + 1);
}

int freq(node* T, char* s){
    if(*s==0)return T -> nr_cuv;
    if(T -> fiu[*s - 'a'] == 0)return 0;
    return freq(T -> fiu[*s - 'a'], s + 1);
}

int del(node* T, char* s){
    if(*s == 0){
        T -> nr_cuv--;
        if(T -> nr_cuv == 0 && T -> nr_fii == 0 && T != root){
            delete T;
            return 1;
        }
        return 0;
    }
    if(del(T -> fiu[*s - 'a'], s+1) == 1){
        T -> nr_fii--;
        T -> fiu[*s - 'a'] = 0;
        if(T -> nr_cuv == 0 && T -> nr_fii == 0 && T != root){
            delete T;
            return 1;
        }
    }
    return 0;
    ///nu am idee inca ce tb sa fac
}

int pref(node* T, char* s){
    if(*s == 0)return 0;
    if(T -> fiu[*s - 'a'] == 0)return 0;
    return 1 + pref(T -> fiu[*s - 'a'], s + 1);
}



int main()
{
    root = new node;
    while(in >> op){
        in >> cuv;
        if(op == 0)add(root, cuv);
        if(op == 1)del(root, cuv);
        if(op == 2)out << freq(root, cuv) << '\n';
        if(op == 3)out << pref(root, cuv) << '\n';

    }
    return 0;
}