/*
题意:给你一堆2进制编码,判断是否任何一组编码都不是其他编码的前缀。
思路:trie树,是不是其他编码的前缀只要判断最后一个数字出现的次数,若只出现一次则
这个号码不会是其他编码的前缀,否则是其他编码的前缀。
*/
#include<iostream>
#include<cstring>
using namespace std;
const int MAXM=100005;
struct Node
{
int value;//出现的次数
Node *child[2];//只有2个孩子节点[0/1]
Node()
{
value=0;
memset(child,NULL,sizeof(child));
}
}*root;
char num[15][15];
bool temp;
void create(char s[])//建树
{
Node *x=root;
for(int i=0;i<strlen(s);i++)
{
int d=s[i]-'0';
if(x->child[d]==NULL)
{
x->child[d]=new Node;
}
x=x->child[d];
x->value++;
}
}
void Search(char s[])//查询
{
Node *x=root;
int len=strlen(s);
for(int i=0;i<len;i++)
{
int d=s[i]-'0';
x=x->child[d];
}
if(x->value!=1)
{
temp=false;
}
}
void DeleteNode(Node *x)//删除节点信息
{
if(x==NULL)
{
return;
}
for(int i=0;i<2;i++)
{
if(x->child[i]!=NULL)
{
DeleteNode(x->child[i]);
}
}
delete x;
}
int main()
{
int t=0,k=0,ans=1;
while(cin>>num[t])
{
if(num[t][0]=='9')//每组数据以‘9’结束
{
temp=true;
root=new Node;
for(int i=0;i<t;i++)
{
create(num[i]);
}
for(int i=0;i<t;i++)
{
Search(num[i]);
if(temp==false)
{
break;
}
}
if(temp)
{
cout<<"Set "<<ans<<" is immediately decodable"<<endl;
}
else
{
cout<<"Set "<<ans<<" is not immediately decodable"<<endl;
}
ans++;
t=0;
k=1;
DeleteNode(root);
}
t++;
t-=k;//k用于保证每一组数据结束k都从0开始。
k=0;
}
return 0;
}
暑假- Trie树-(G - IMMEDIATE DECODABILITY)
原文作者:Trie树
原文地址: https://blog.csdn.net/slime_kirito/article/details/47102727
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/slime_kirito/article/details/47102727
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。