Pagini recente » Cod sursa (job #2929405) | Cod sursa (job #2773333) | Cod sursa (job #483210) | Cod sursa (job #1946493) | Cod sursa (job #1495826)
#include<fstream>
#include<string.h>
using namespace std;
#define CODE(x) x-'a'
#define MAX 26
struct Node
{
Node *e[MAX];
int n_rep;
int n_child;
Node()
{
n_rep = 0;
n_child = 0;
memset(e, 0, sizeof(e));
}
};
ifstream in("trie.in");
ofstream out("trie.out");
class Trie
{
Node *tree;
public:
Trie();
void add(const char *str);
void remove(const char *str);
int count(const char *str);
int samePrefix(const char*str);
};
Trie::Trie()
{
tree = new Node;
}
void Trie::add(const char *str)
{
Node *q=tree;
for (int i = 0;str[i] != '\0';++i)
{
if (!q->e[CODE(str[i])])
{
q->e[CODE(str[i])] = new Node;
++q->n_child;
}
if(str[i+1]=='\0')
++q->e[CODE(str[i])]->n_rep;
q = q->e[CODE(str[i])];
}
}
void Trie::remove(const char *str)
{
Node *q = tree;
Node *stack[20];
int st = 0,i;
stack[st++] = q;
for (i = 0;str[i] != '\0' && q->e[CODE(str[i])];++i)
stack[st++] = q->e[CODE(str[i])] , q= q->e[CODE(str[i])];
if (str[i] == '\0')
{
--st;
if (stack[st]->n_rep > 1)
{
--stack[st]->n_rep;
return;
}
--stack[st]->n_rep;
while (st >= 1 && stack[st]->n_child == 0 && stack[st]->n_rep==0 )
{
stack[st - 1]->e[CODE(str[st - 1])] = 0;
delete stack[st];
--stack[st - 1]->n_child;
--st;
}
}
}
int Trie::count(const char *str)
{
Node *q=tree;
int i;
for (i = 0;str[i] != '\0' && q->e[CODE(str[i])];++i)
q = q->e[CODE(str[i])];
if (str[i] == '\0')
return q->n_rep;
return 0;
}
int Trie::samePrefix(const char *str)
{
Node *q = tree;
int i,nr=0;
for (i = 0;str[i] != '\0' && q->e[CODE(str[i])];++i)
q = q->e[CODE(str[i])], ++nr;
return nr;
}
int main()
{
Trie trie;
int i;
char s[20];
while (in >> i && in >> s)
{
switch (i)
{
case 0:
trie.add(s);
break;
case 1:
trie.remove(s);
break;
case 2:
out<<trie.count(s)<<'\n';
break;
case 3:
out << trie.samePrefix(s)<<'\n';
break;
}
}
return 0;
}