Pagini recente » Cod sursa (job #2100225) | Cod sursa (job #2254073) | Cod sursa (job #724597) | Cod sursa (job #1084585) | Cod sursa (job #1332478)
#include <fstream>
#define Cmax 26
#define ord(x) (x - 97)
#define nextNode node->Son[ord(*p)]
using namespace std;
class Dictionary {
private:
struct Node {
int sonCount, wordCount;
Node * Son[Cmax];
Node() {
wordCount = sonCount = 0;
for(int i = 0; i < Cmax; i++)
Son[i] = NULL;
}
};
Node * root;
void erase(Node * node, char * p) {
if(*p == 0)
node->wordCount--;
else {
erase(nextNode, p + 1);
if(nextNode->wordCount == 0 && nextNode->sonCount == 0) {
delete nextNode;
nextNode = NULL;
node->sonCount--;
}
}
}
public:
Dictionary() {
root = new Node;
}
void insert(char * p) {
Node * node = root;
while(*p) {
if(nextNode == NULL) {
nextNode = new Node;
node->sonCount++;
}
node = nextNode;
p++;
}
node->wordCount++;
}
void erase(char * p) {
erase(root, p);
}
int search(char * p) {
Node * node = root;
while(*p) {
if(nextNode == NULL)
return 0;
node = nextNode;
p++;
}
return node->wordCount;
}
int prefix(char * p) {
int length = 0;
Node * node = root;
while(*p) {
if(nextNode == NULL)
break;
node = nextNode;
length++;
p++;
}
return length;
}
} dictionary;
int main() {
char line[Cmax];
ifstream in("trie.in");
ofstream out("trie.out");
while(in.getline(line, Cmax))
switch(line[0]) {
case '0':
dictionary.insert(line + 2);
break;
case '1':
dictionary.erase(line + 2);
break;
case '2':
out << dictionary.search(line + 2) << '\n';
break;
case '3':
out << dictionary.prefix(line + 2) << '\n';
}
in.close();
out.close();
return 0;
}