Pagini recente » Cod sursa (job #554432) | Cod sursa (job #2177649) | Cod sursa (job #890132) | Cod sursa (job #3177729) | Cod sursa (job #3187594)
#include <iostream>
#include <fstream>
#include <cstring>
#define cv (*s - 'a') // convert
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie {
struct trienode {
int nr, nrchild;
trienode* child[26];
trienode() {
nr = nrchild = 0;
memset(child, 0, sizeof(child));
}
};
trienode* root = new trienode;
void ins(trienode* node, char* s) {
if (*s == '\0') {
node->nr++; return;
}
if (node->child[cv] == 0) {
node->child[cv] = new trienode;
node->nrchild++;
}
ins(node->child[cv], s + 1);
}
int del(trienode* node, char* s) {
if (*s == '\0')
node->nr--;
else if (del(node->child[cv], s + 1)) {
node->child[cv] = 0;
node->nrchild--;
}
if (node->nr == 0 && node->nrchild == 0 && node != root) {
delete node; return 1;
}
return 0;
}
int query(trienode* node, char* s) {
if (*s == '\0')
return node->nr;
if (node->child[cv])
return query(node->child[cv], s + 1);
return 0;
}
int prefix(trienode* node, char* s, int k) {
if (*s == '\0' || node->child[cv] == 0)
return k;
return prefix(node->child[cv], s + 1, k + 1);
}
};
trie t;
int main() {
char s[32];
while (fin.getline(s, 32)) {
switch (s[0]) {
case '0': t.ins(t.root, s + 2); break;
case '1': t.del(t.root, s + 2); break;
case '2': fout << t.query(t.root, s + 2) << "\n"; break;
case '3': fout << t.prefix(t.root, s + 2, 0) << "\n"; break;
}
}
return 0;
}