Pagini recente » Cod sursa (job #566194) | Cod sursa (job #425720) | Cod sursa (job #25270) | Cod sursa (job #2153215) | Cod sursa (job #1326611)
/// trie
#include <iostream>
#include <cstring>
#include <fstream>
#define ch (*s - 'a')
using namespace std;
struct trie {
int cnt, fii;
trie *sons[26];
trie() {
cnt = fii = 0;
for (int i=0;i<26;i++)
sons[i] = NULL;
}
~trie() {
for (int i=0;i<26;i++)
delete sons[i];
}
};
ifstream f("trie.in");
ofstream g("trie.out");
trie *root;
bool trieRemove(trie *node, char *s) {
if (*s == '\0')
node->cnt--;
else if (trieRemove(node->sons[ch], s+1)) {
node->sons[ch] = NULL;
node->fii--;
}
if (node != root && node->cnt == 0 && node->fii == 0) {
delete node;
return true;
}
return false;
}
void trieAdd(trie *node, char *s) {
if (*s == '\0') {
node->cnt++; return;
}
if (node->sons[ch] == NULL) {
node->fii++;
node->sons[ch] = new trie();
}
trieAdd(node->sons[ch], s+1);
}
int triePref(trie *node, char *s, int k) {
if(*s == '\0' || node->sons[ch] == 0)
return k;
return triePref(node->sons[ch], s+1, k+1);
}
int trieFreq(trie *node, char *s) {
if (*s == '\0')
return node->cnt;
else if (node->sons[ch] != NULL)
return trieFreq(node->sons[ch], s+1);
return 0;
}
int main() {
root = new trie();
char in[50];
while (f.getline(in, 50)) {
if (in[0] == '0') {
trieAdd(root, in+2);
} else if (in[0] == '1') {
trieRemove(root, in+2);
} else if (in[0] == '2') {
g<<trieFreq(root, in+2)<<'\n';
} else if (in[0] == '3') {
g<<triePref(root, in+2, 0)<<'\n';
}
}
f.close(); g.close();
return 0;
}