Cod sursa(job #2026216)

Utilizator Alex18maiAlex Enache Alex18mai Data 23 septembrie 2017 22:31:56
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
#include <fstream>

using namespace std;

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

const int lit = 26;

struct node{
    node(){
        ap = 0;
        pref = 0;
        for (int i=0; i<lit; i++){
            next[i] = NULL;
        }
    }
    int ap;
    int pref;
    node *next [lit];
};

void add_word (node *prev , string word , int pos , int size){
    if (pos == size){
        prev -> ap ++;
        return;
    }
    if (prev -> next[word[pos] - 'a'] == NULL){
        prev -> next[word[pos] - 'a'] = new node();
    }
    prev = prev -> next[word[pos] - 'a'];
    prev -> pref ++;
    add_word (prev , word , pos + 1 , size);
}

void delete_word (node *prev , string word , int pos , int size){
    if (pos == size){
        prev -> ap --;
        return;
    }
    prev = prev -> next[word[pos] - 'a'];
    prev -> pref --;
    delete_word (prev , word , pos + 1 , size);
}

int ap_word (node *prev , string word , int pos , int size){
    if (prev == NULL){
        return 0;
    }
    if (pos == size){
        return (prev -> ap);
    }
    return ap_word (prev -> next[word[pos] - 'a'] , word , pos + 1 , size);
}

int pref_word (node *prev , string word , int pos , int lung , int size){
    prev = prev -> next[word[pos] - 'a'];
    if (pos == size - 1){
        return lung;
    }
    if (prev == NULL || prev -> pref == 0){
        return lung;
    }
    return pref_word (prev , word , pos + 1, lung + 1 , size);
}


int main() {

    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int test;
    string word;
    node *root = new node();

    while(cin>>test){
        cin>>word;
        if (test == 0){
            add_word(root , word , 0 , word.size());
        }
        if (test == 1){
            delete_word(root , word , 0 , word.size());
        }
        if (test == 2){
            int ans = ap_word(root , word , 0 , word.size());
            cout<<ans<<'\n';
        }
        if (test == 3){
            int ans = pref_word(root , word , 0 , 0 , word.size());
            cout<<ans<<'\n';
        }
    }
    return 0;
}