#include <stdio.h>
#include <cstring>/**
若A是B的前缀,有两种情况,一是A先建树(短的先建树),二是B先建树 (长的先建树)
*/struct Node {
int length;
Node *next[2];
Node() {
length = 0;
memset(next, 0, sizeof(next));
}
};Node *root = new Node;
bool Insert(char *s)
{
Node *p = root;
int len = strlen(s), id;
bool flag1 = false;
bool flag2 = false;
for(int i = 0; i < len; i++)
{
id = s[i] - '0';
if(i == len-1 && p->next[id] != 0) //长的先建树
flag1 = true;
if(p->next[id] == 0)
{
if(p->length > 0) //短的先建树
flag2 = true;
p->next[id] = new Node;
}
p = p->next[id];
}
p->length = len; //将字符串长度存到叶子节点
if(flag1 || flag2)
return true;
return false;
}void Del(Node *p)
{
if(p == NULL)
return;
for(int i = 0; i < 2; i++)
if(p->next[i] != NULL)
Del(p->next[i]);
delete p;
}int main()
{
char str[1000];
bool flag = false;
int count = 1;
while(~scanf("%s", str))
{
if(strcmp(str, "9") == 0)
{
if(!flag)
printf("Set %d is immediately decodable\n", count);
else
printf("Set %d is not immediately decodable\n", count);
Del(root); //每次输入后要重新建树
root = new Node;
count++;
flag = false;
continue;
}
if(!flag)
flag = Insert(str);
}
return 0;
}
Immediate Decodability HDU - 1305(字典树)
猜你喜欢
转载自blog.csdn.net/mch2869253130/article/details/82218077
今日推荐
周排行