Cod sursa(job #2319847)

Utilizator Horia14Horia Banciu Horia14 Data 13 ianuarie 2019 22:23:47
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.27 kb
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define SIGMA 26
#define MAX_LEN 20
using namespace std;

struct trieNode {
    int cnt, fin;
    trieNode* child[SIGMA];
};

trieNode* root;

trieNode* getNode() {
    trieNode* node = (trieNode*)malloc(sizeof(trieNode));
    node->cnt = node->fin = 0;
    for(int i = 0; i < SIGMA; i++)
        node->child[i] = NULL;
    return node;
}

void insertWord(trieNode* root, char* word) {
    trieNode* node = root;
    int len = strlen(word);
    for(int i = 0; i < len; i++) {
        if(node->child[word[i] - 'a'] == NULL)
            node->child[word[i] - 'a'] = getNode();
        node = node->child[word[i] - 'a'];
        ++node->cnt;
    }
    ++node->fin;
}

void deleteWord(trieNode* root, char* word) {
    trieNode* node, *node2;
    node = node2 = root;
    int len = strlen(word);
    for(int i = 0; i < len; i++) {
        node2 = node->child[word[i] - 'a'];
        --node2->cnt;
        if(node2->cnt == 0)
            node->child[word[i] - 'a'] = NULL;
        if(node->cnt == 0)
            free(node);
        node = node2;
    }
    --node2->fin;
}

int searchWord(trieNode* root, char* word) {
    trieNode* node = root;
    int i = 0, len = strlen(word);
    while(i < len && node->child[word[i] - 'a'] != NULL) {
        node = node->child[word[i] - 'a'];
        i++;
    }
    if(i == len)
        return node->fin;
    else return 0;
}

int searchPrefix(trieNode* root, char* word) {
    trieNode* node = root;
    int i = 0, len = strlen(word);
    while(i < len && node->child[word[i] - 'a'] != NULL) {
        node = node->child[word[i] - 'a'];
        i++;
    }
    return i;
}

int main() {
    char word[MAX_LEN+1];
    int op;
    FILE* fin, *fout;
    fin = fopen("trie.in","r");
    fout = fopen("trie.out","w");
    root = getNode();
    root->cnt = 1;
    while(!feof(fin)) {
        fscanf(fin,"%d %s\n",&op,word);
        switch(op) {
        case 0 :
            insertWord(root,word);
            break;
        case 1 :
            deleteWord(root,word);
            break;
        case 2 :
            fprintf(fout,"%d\n",searchWord(root,word));
            break;
        case 3 :
            fprintf(fout,"%d\n",searchPrefix(root,word));
            break;
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}