Pagini recente » Cod sursa (job #3230512) | Cod sursa (job #1681016) | Cod sursa (job #1816954) | Cod sursa (job #2629683) | Cod sursa (job #419261)
Cod sursa(job #419261)
#include <fstream>
#include <cstring>
using namespace std;
const int SIGMAX = 'z' - 'a' + 2;
class node {
public:
node* son[SIGMAX];
int counter;
char nrSons;
node() {
counter = nrSons = 0;
memset(son, 0, sizeof(node*) * SIGMAX);
}
};
class trie {
node root;
bool remRec(node*,const char*);
public:
trie() {root.counter = 1;};
void add(char*);
void remove(const char*);
int count(char*);
int maxPrefix(char*);
};
inline int cind1(const char x) { return x - 'a' + 1; }
void trie::add(char *w)
{
node *cn = &root;
for (; *w; ++w) {
int i = cind1(*w);
if (cn -> son[i] == NULL) {
cn -> son[i] = new node;
++ cn->nrSons;
}
cn = cn -> son[i];
}
++(cn -> counter);
}
bool trie::remRec(node *a, const char *w)
{
if (!*w) -- a->counter;
else if (remRec(a->son[cind1(*w)], w + 1)) {
a -> son[cind1(*w)] = NULL;
-- a->nrSons;
}
if (! a->nrSons && ! a->counter) {
delete a;
return true;
} else return false;
}
void trie::remove(const char *w)
{ remRec(&root, w); }
int trie::count(char *w)
{
node *cn = &root;
for (; *w && (cn = cn -> son[cind1(*w)]); ++w);
if (cn == NULL) return 0;
else return cn -> counter;
}
int trie::maxPrefix(char *w)
{
node *cn = &root;
int ans = 0;
for (; *w && (cn = cn -> son[cind1(*w)]); ++w, ++ans);
return ans;
}
int main()
{
trie T;
int op; char w[SIGMAX];
ifstream f1("trie.in");
freopen("trie.out", "w", stdout);
while(f1 >> op >> w) {
switch (op) {
case 0: T.add(w); break;
case 1: T.remove(w); break;
case 2: printf("%d\n", T.count(w)); break;
case 3: printf("%d\n", T.maxPrefix(w)); break;
}
}
f1.close();
return 0;
}