Cod sursa(job #1314562)

Utilizator retrogradLucian Bicsi retrograd Data 11 ianuarie 2015 23:17:00
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include<fstream>
#include<cstring>
#define NEXT root -> next[word[0]-'a']

using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

struct Trie {
    int ap;
    Trie *next[26];
    Trie(int apa) {
        ap = apa;
        memset(next, NULL, sizeof(next));
    }
};
typedef Trie* pTrie;

pTrie root, p;


void addWord(char *word, pTrie root) {
    if(word[0] != NULL) {
        if(!NEXT) {
            NEXT = new Trie(1);
        }
        else
            NEXT -> ap ++;
        addWord(word+1, NEXT);
    }
}

void removeWord(char word[21], pTrie root) {
    if(word[0] != NULL) {
        removeWord(word+1, NEXT);
        if(NEXT -> ap == 1) {
            delete NEXT;
            NEXT = NULL;
        } else {
            NEXT -> ap--;
        }
    }
}

int findPref(char word[21], pTrie root) {
    if(NEXT == NULL) return 0;
    if(word[0] == NULL) return 0;
    return 1 + findPref(word + 1, NEXT);
}

int nrap (char word[21], pTrie root) {
    if(NEXT == NULL) return 0;
    if(word[1] == NULL) {
        int s = 0;
        for(int i=0; i<26; i++) {
            if(NEXT -> next[i])
                s+= NEXT -> next[i] -> ap;
        }
        return NEXT -> ap - s;
    }
    return nrap(word+1, NEXT);
}

int main() {
    int type; char word[21];
    pTrie root = new Trie(0);
    while(fin>>type>>word) {
        if(type == 0) {
            addWord(word, root);
        } else if(type == 1) {
            removeWord(word, root);
        } else if(type == 3) {
            fout<<findPref(word, root)<<'\n';
        } else {
            fout<<nrap(word, root)<<'\n';
        }
    }

    return 0;
}