Pagini recente » Cod sursa (job #789701) | Cod sursa (job #1743031) | Cod sursa (job #35486) | Cod sursa (job #1672171) | Cod sursa (job #2361820)
#include <fstream>
#include <cstring>
using namespace std;
ifstream in ( "trie.in" );
ofstream out ( "trie.out" );
struct Node {
int cnt;
char noSons;
Node* sons[26];
Node() {
cnt = 0;
noSons = 0;
memset(sons, 0, sizeof(sons));
}
};
Node* T = new Node;
void insert(Node* node, char* s) {
if (!*s) {
++node->cnt;
return;
}
if (!node->sons[*s - 'a']) {
node->sons[*s - 'a'] = new Node;
++node->noSons;
}
insert(node->sons[*s - 'a'], s + 1);
}
int erase(Node* node, char* s) {
if (!*s) {
--node->cnt;
} else if (erase(node->sons[*s - 'a'], s + 1)) {
node->sons[*s - 'a'] = NULL;
--node->noSons;
}
if (!node->cnt && !node->noSons && node != T) {
delete node;
return 1;
}
return 0;
}
int queryCnt(Node* node, char* s) {
if (!*s)
return node->cnt;
if (node->sons[*s - 'a'])
return queryCnt(node->sons[*s - 'a'], s + 1);
return 0;
}
int queryPrefix(Node* node, char* s) {
if (!*s || !node->sons[*s - 'a'])
return 0;
return 1 + queryPrefix(node->sons[*s - 'a'], s + 1);
}
int main() {
char line[35];
while (in.getline(line, 35)) {
if (line[0] == '0')
insert(T, line + 2);
else if (line[0] == '1')
erase(T, line + 2);
else if (line[0] == '2')
out << queryCnt(T, line + 2) << '\n';
else
out << queryPrefix(T, line + 2) << '\n';
}
}