Pagini recente » Istoria paginii runda/olimpici | Cod sursa (job #2467885) | Istoria paginii runda/becreative8 | Cod sursa (job #2610070) | Cod sursa (job #2530502)
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Node{
int sonCount, cnt;
Node* sons[26];
};
Node* root;
void addWord(Node* node, char* word) {
char c = *word;
if (c == '\0') {
++node -> cnt;
return;
}
int i = c - 'a';
if (node -> sons[i] == nullptr) {
++node -> sonCount;
node -> sons[i] = new Node;
}
addWord(node -> sons[i], word + 1);
}
bool deleteWord(Node* node, char* word) {
char c = *word;
int i = c - 'a';
if (c == '\0') {
--node -> cnt;
}
else if (deleteWord(node -> sons[i], word + 1)) {
--node -> sonCount;
node -> sons[i] = nullptr;
}
if (node != root && node -> sonCount == 0 && node -> cnt == 0) {
delete node;
return true;
}
return false;
}
int getCount(Node* node, char* word) {
char c = *word;
if (c == '\0') {
return node -> cnt;
}
if (node -> cnt == 0 && node -> sonCount == 0) {
return 0;
}
getCount(node -> sons[c - 'a'], word + 1);
}
int getLenghtOfLongestPrefix(Node* node, char* prefix) {
char c = *prefix;
int i = c - 'a';
if (c == '\0' || node -> sons[i] == nullptr) {
return 0;
}
return getLenghtOfLongestPrefix(node -> sons[i], prefix + 1) + 1;
}
int main()
{
root = new Node;
int t;
char w[25];
while (fin >> t >> w) {
if (t == 0) {
addWord(root, w);
}
else if (t == 1) {
deleteWord(root, w);
}
else if (t == 2) {
fout << getCount(root, w) << "\n";
}
else {
fout << getLenghtOfLongestPrefix(root, w) << "\n";
}
}
return 0;
}