Cod sursa(job #1245818)

Utilizator FayedStratulat Alexandru Fayed Data 20 octombrie 2014 02:27:32
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
#include <cstdio>
#include <cstring>
#include <cstdlib>

char s[23];

struct Trie{

    int numberOfWords;
    int numberOfSons;
    Trie* nextNode[26];

    Trie(){

        numberOfSons = 0;
        numberOfWords = 0;
        memset(nextNode,0,sizeof(nextNode));
    }
};

Trie* ROOT = new Trie;

void insertWord(Trie* root, char* str){

    if(*str == '\n'){

        ++root->numberOfWords;
        return;
    }

    if(root->nextNode[*str - 'a'] == 0){

        root->nextNode[*str - 'a'] = new Trie;
        ++root->numberOfSons;
    }
    insertWord(root->nextNode[*str - 'a'], str+1);
}

bool deleteNode(Trie* root, char* str){

    if(*str == '\n')
        --root->numberOfWords;

    else if(deleteNode(root->nextNode[*str - 'a'], str+1)){

        root->nextNode[*str - 'a'] = 0;
        --root->numberOfSons;
    }
    if(root->numberOfWords == 0 && root->numberOfSons == 0 && root != ROOT){

            delete root;
            return 1;
    }

return 0;
}

int wordApp(Trie* root, char* str){

    if(*str == '\n')
        return root->numberOfWords;
    if(root->nextNode[*str - 'a'])
        return wordApp(root->nextNode[*str - 'a'], str+1);

return 0;
}

int largestPrefix(Trie* root, char* str, int maxPrefix){

    if(*str == '\n' || root->nextNode[*str - 'a'] == 0)
        return maxPrefix;
    return largestPrefix(root->nextNode[*str - 'a'], str+1, maxPrefix+1);
}

int main(){

    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);

    fgets(s,23,stdin);
    while(!feof(stdin)){

        switch(s[0]){

            case '0': insertWord(ROOT, s+2);
                      break;
            case '1': deleteNode(ROOT, s+2);
                      break;
            case '2': printf("%d\n", wordApp(ROOT, s+2));
                      break;
            case '3': printf("%d\n", largestPrefix(ROOT, s+2, 0));
                      break;
        }
    fgets(s,23,stdin);
    }

return 0;
}