Cod sursa(job #2244757)

Utilizator AnDrEeA1915Monea Andreea AnDrEeA1915 Data 23 septembrie 2018 16:43:34
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include <bits/stdc++.h>
#include <fstream>

using namespace std;

struct trie {
    int f, cnt;
    trie* child[26];
};

trie* root;

trie* getNode() {
    trie* node = new trie;
    node->f = node->cnt = 0;
    for(int i = 0; i < 26; i++)
        node->child[i] = NULL;
    return node;
}

void insertT(trie* root, char* cuv) {
    trie* node = root;
    int l = strlen(cuv);
    for(int i = 0; i < l; i++) {
        if(node->child[cuv[i]-'a'] == NULL)
            node->child[cuv[i]-'a'] = getNode();
        node = node->child[cuv[i]-'a'];
        ++node->cnt;
    }
    ++node->f;
}

int searchT(trie* root, char* cuv) {
    trie* node = root;
    int l = strlen(cuv);
    int i = 0;
    while(i < l && node->child[cuv[i]-'a'] != NULL) {
        node = node->child[cuv[i]-'a'];
        i++;
    }
    if(i == l)
        return node->f;
    else return 0;
}

int prefix(trie* root, char* cuv) {
    trie* node = root;
    int l = strlen(cuv);
    int i = 0;
    while(i < l && node->child[cuv[i]-'a'] != NULL) {
        node = node->child[cuv[i]-'a'];
        i++;
    }
    return i;
}

void deleteT(trie* root, char* cuv) {
    trie* node = root;
    trie* node2 = root;
    int l = strlen(cuv);
    for(int i = 0; i < l; i++) {
        node2 = node->child[cuv[i]-'a'];
        --node2->cnt;
        if(node2->cnt == 0)
            node->child[cuv[i]-'a'] = NULL;
        if(node->cnt == 0)
            delete node;
        node = node2;
    }
    --node2->f;
}

int main() {
    int op;
    char cuv[21];
    ifstream fin ("trie.in");
    ofstream fout ("trie.out");
    root = getNode();
    root->cnt = 1;
    while( fin >> op >> cuv) {
        if(op == 0)
            insertT(root,cuv);
        else if(op == 1)
            deleteT(root,cuv);
        else if(op == 2)
            fout << searchT(root,cuv);
        else fout << prefix(root,cuv);
    }

    return 0;
}