Cod sursa(job #1514686)

Utilizator adimAlexander Dmitriev adim Data 31 octombrie 2015 14:04:52
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 kb
#include <bits/stdc++.h>
using namespace std;
 
struct trie {
    int no;
    int childs;
    trie *child[26];
     
    trie() {
        no = childs = 0;
        for (int i=0;i<26;i++)
            child[i] = NULL;
    }
};
 
ifstream f("trie.in");
ofstream g("trie.out");
 
string word;
trie *root = new trie();
 
int findPrefix() {
    int prefix = 0;
    trie *node = root;
     
    for (int i=0;i<word.size();i++) {
        if (node->child[word[i] - 'a'] != NULL) {
            node = node->child[word[i] - 'a'];
            prefix++;
        } else
            return prefix;
    }
     
    return prefix;
}
 
int queryWord() {
    trie *node = root;
    for (int i=0;i<word.size();i++) {
        if (node->child[word[i] - 'a'] == NULL) {
            return 0;
        }
         
        node = node->child[word[i] - 'a'];
    }
     
    return node->no;
}
 
int deleteWord(int index, trie* &node) {
    if (index == word.size()) {
        node->no--;
    } else if (deleteWord(index+1, node->child[word[index] - 'a'])) {
		node->child[word[index] - 'a'] = NULL;
		node->childs--;
	}
    
    if (node->childs == 0 && node->no == 0 && node != root) {
		node = NULL;
	}
    return 0;
}
 
void addWord() {
    trie *node = root;
    for (int i=0;i<word.size();i++) {
        if (node->child[word[i] - 'a'] == NULL) {
            node->child[word[i] - 'a'] = new trie();
            node->childs++;
        }
         
        node = node->child[word[i] - 'a'];
    }
     
    node->no++;
}
 
void read() {
    int tip;
     
    while (f>>tip) {
        f>>word;
        if (tip == 0) {
            // adauga o aparitie a cuvantului w in lista
            addWord();
        } else if (tip == 1) {
            // sterge o aparitie a cuvantului w din lista
            deleteWord(0, root);
        } else if (tip == 2) {
            // tipareste numarul de aparitii ale cuvantului w in lista
            g<<queryWord()<<'\n';
        } else if (tip == 3) {
            // tipareste lungimea celui mai lung prefix comun al lui w cu oricare cuvant din lista
            g<<findPrefix()<<'\n';
        }
    }
}
 
int main() {
 
    read();
     
    f.close(); g.close();
    return 0;
}