Pagini recente » Cod sursa (job #2270080) | Cod sursa (job #3003290) | Cod sursa (job #2237209) | Cod sursa (job #1545792) | Cod sursa (job #1251891)
#include <fstream>
#define Cmax 26
#define Smax 100
#define ord(x) (x - 'a')
#define nextNode node->Son[ord(*pointer)]
using namespace std;
struct Node {
int sonCount, wordCount;
Node * Son[Cmax];
Node() {
sonCount = wordCount = 0;
for(int i = 0; i < Cmax; i++)
Son[i] = 0;
}
};
class Dictionary {
private:
Node * Root;
public:
Dictionary() {
Root = new Node;
}
void insert(char * pointer) {
Node * node = Root;
while(*pointer) {
if(nextNode == 0)
nextNode = new Node,
node->sonCount++;
node = nextNode;
pointer++;
}
node->wordCount++;
}
void remove(char * pointer) {
remove(Root, pointer);
}
int count(char * pointer) {
Node * node = Root;
while(*pointer) {
if(nextNode == 0)
return 0;
node = nextNode;
pointer++;
}
return node->wordCount;
}
int prefix(char * pointer) {
Node * node = Root;
int length = 0;
while(*pointer) {
if(nextNode == 0)
break;
node = nextNode;
pointer++;
length++;
}
return length;
}
private:
void remove(Node * node, char * pointer) {
if(!*pointer)
node->wordCount--;
else {
remove(nextNode, pointer + 1);
if(nextNode->sonCount == 0 && nextNode->wordCount == 0 && nextNode != Root) {
delete nextNode;
nextNode = 0;
node->sonCount--;
}
}
}
} D;
int main() {
char line[Smax];
ifstream in("trie.in");
ofstream out("trie.out");
while(in.getline(line, Smax))
switch(line[0]) {
case '0':
D.insert(line + 2);
break;
case '1':
D.remove(line + 2);
break;
case '2':
out << D.count(line + 2) << '\n';
break;
case '3':
out << D.prefix(line + 2) << '\n';
break;
}
in.close();
out.close();
return 0;
}