Pagini recente » Cod sursa (job #2566969) | Cod sursa (job #2695372) | Cod sursa (job #2174547) | Cod sursa (job #2901906) | Cod sursa (job #1533302)
#include <fstream>
#include <cstring>
#include <string>
using namespace std;
const string file_name = "trie",
in_file_name = file_name + ".in",
out_file_name = file_name + ".out";
ifstream fin(in_file_name);
ofstream fout(out_file_name);
struct Node {
int pre, cnt;
Node *f[26];
Node() {
pre = cnt = 0;
memset(f, 0, sizeof(f));
}
};
void add_word(Node *node, int pos, string& word) {
if (pos == word.size()) {
node -> cnt++;
return;
}
int letter = word[pos] - 'a';
if (node -> f[letter] == NULL)
node -> f[letter] = new Node();
node -> f[letter] -> pre++;
add_word(node -> f[letter], pos + 1, word);
}
void remove_word(Node *node, int pos, string& word) {
if (pos == word.size()) {
node -> cnt--;
return;
}
int letter = word[pos] - 'a';
node -> f[letter] -> pre--;
remove_word(node -> f[letter], pos + 1, word);
}
int count_word(Node *node, int pos, string& word) {
if (pos == word.size())
return node -> cnt;
int letter = word[pos] - 'a';
if (node -> f[letter] == NULL)
return 0;
return count_word(node -> f[letter], pos + 1, word);
}
int count_prefix(Node *node, int pos, string& word) {
if (pos == word.size())
return word.size();
int letter = word[pos] - 'a';
if (node -> f[letter] == NULL || !(node -> f[letter] -> pre))
return pos;
return count_prefix(node -> f[letter], pos + 1, word);
}
int main() {
int query;
string word;
Node *root = new Node();
while (fin >> query >> word)
switch (query) {
case 0:
add_word(root, 0, word);
break;
case 1:
remove_word(root, 0, word);
break;
case 2:
fout << count_word(root, 0, word) << '\n';
break;
case 3:
fout << count_prefix(root, 0, word) << '\n';
break;
}
return 0;
}