Pagini recente » Cod sursa (job #1811318) | Cod sursa (job #2550192) | Cod sursa (job #1750329) | Cod sursa (job #630064) | Cod sursa (job #1514686)
#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;
}