Cod sursa(job #2553628)

Utilizator AntoniuFicAntoniu Ficard AntoniuFic Data 22 februarie 2020 10:34:24
Problema Trie Scor 5
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.38 kb
#include <iostream>
#include <fstream>
#include <string>
#include <cstring>

using namespace std;

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

struct node{
    node *copii[26] = {nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr};
    int val = 0, numberOfChildren = 0;
}*tree = new node();

void insertie(string s){
    node* leaf = tree;
    for (int i = 0; i < s.length(); ++i) {
        if(leaf->copii[int(s[i] - 'a')] == nullptr){
            leaf->copii[int(s[i] - 'a')] = new node();
            leaf->numberOfChildren++;
        }
        leaf = leaf->copii[int(s[i] - 'a')];
    }
    leaf->val++;
}

bool deleter(node* &leaf, char word[]){
    if(leaf->copii[int(word[0] - 'a')] != nullptr)
        (deleter(leaf->copii[int(word[0] - 'a')], word + 1)) ? leaf->numberOfChildren-- : NULL;
    if(leaf->val > 0 && strlen(word) == 0){
        leaf->val--;
    }
    if(leaf->numberOfChildren == 0 && leaf->val == 0){
        delete leaf;
        leaf = nullptr;
        return true;
    }
    return false;
}

int howManyTimes(string s){
    node* leaf = tree;
    for (int i = 0; i < s.length(); ++i) {
        if(leaf->copii[int(s[i] - 'a')] == nullptr)
            return 0;
        else leaf = leaf->copii[int(s[i] - 'a')];
    }
    return leaf->val;
}

int longestPrefix(string s){
    int longest = 0;
    node* leaf = tree;
    for (int i = 0; i < s.length(); ++i) {
        if(leaf->copii[int(s[i] - 'a')] == nullptr)
            return i;
        else{
            if(leaf->numberOfChildren > 1)
                longest = i;
            leaf = leaf->copii[int(s[i] - 'a')];
        }
    }
    return longest;
}

int main() {
    string s;
    int op;
    while(f>>op>>s){
        switch(op){
            case 0:{
                insertie(s);
                break;
            }
            case 1:{
                char word[21];
                strcpy(word, s.c_str());
                deleter(tree, word);
                break;
            }
            case 2:{
                g<<howManyTimes(s)<<"\n";
                break;
            }
            case 3:{
                g<<longestPrefix(s)<<"\n";
                break;
            }
            default: break;
        }
    }
    f.close();
    g.close();
    return 0;
}