Cod sursa(job #2082275)

Utilizator alittlezzCazaciuc Valentin alittlezz Data 5 decembrie 2017 21:43:35
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <bits/stdc++.h>

using namespace std;
#define ll long long

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

struct Node{
    Node(){
        for(int i = 0;i < 26;i++){
            a[i] = NULL;
        }
        pref = end = 0;
    }

    Node *a[26];
    int pref, end;
};

Node *root = new Node();
char s[25];
int n;

void add(Node *cr, int i){
    if(cr->a[s[i] - 'a'] == NULL){
        cr->a[s[i] - 'a'] = new Node();
    }
    cr->a[s[i] - 'a']->pref++;
    if(i == n){
        cr->a[s[i] - 'a']->end++;
    }else{
        add(cr->a[s[i] - 'a'], i + 1);
    }
}

void del(Node *cr, int i){
    if(i == n + 1){
        return;
    }
    del(cr->a[s[i] - 'a'], i + 1);
    cr->a[s[i] - 'a']->pref--;
    cr->a[s[i] - 'a']->end--;
    if(cr->a[s[i] - 'a']->pref == 0){
        cr->a[s[i] - 'a'] = NULL;
        delete cr->a[s[i] - 'a'];
    }
}

int printAp(Node *cr, int i){
    if(cr->a[s[i] - 'a'] == NULL){
        return 0;
    }
    if(i == n){
        return cr->a[s[i] - 'a']->end;
    }
    return printAp(cr->a[s[i] - 'a'], i + 1);
}

int longestPref(Node *cr, int i){
    if(cr->a[s[i] - 'a'] == NULL){
        return i - 1;
    }
    if(i == n){
        return n;
    }
    return longestPref(cr->a[s[i] - 'a'], i + 1);
}

int main(){
    int op;
    while(fin >> op){
        fin >> s + 1;
        n = strlen(s + 1);
        if(op == 0){
            add(root, 1);
        }else if(op == 1){
            del(root, 1);
        }else if(op == 2){
            fout << printAp(root, 1) << '\n';
        }else{
            fout << longestPref(root, 1) << '\n';
        }
    }
    return 0;
}