Pagini recente » Cod sursa (job #2510465) | Istoria paginii runda/judet9-1 | Rating Oso Agent (osoagent) | Istoria paginii runda/judet9-1 | Cod sursa (job #2530696)
#include <fstream>
#include <iostream>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Node{
int sonCount, cnt;
Node* sons[26];
Node(): sonCount(0), cnt(0) {
memset(sons, 0, sizeof(sons));
}
};
Node* root = new Node;
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 (node == nullptr) {
return 0;
}
if (c == '\0') {
return node -> cnt;
}
return 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()
{
int t;
char w[22];
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;
}