题目大意:给你一些二进制组成的密码,询问是否可以解码,规定如果这些密码里存在某些二进制密码是另外一些二进制密码的前缀,则不可以解码,如果不是则代表可以解码,以数字9代表当前一组数据输入结束。
字典树的应用,感觉这种数据结构就是个模拟,耗费内存好大啊。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char str[20];
int tot = 0;
struct node
{
int next[3];
int v;
void init(){
v = 0;
memset(next,-1,sizeof(next));
}
}tree[1005];
void add(char a[],int len)
{
int now = 0;
for(int i=0;i<len;i++){
int tmp = a[i]-'0';
//printf("%d ",tmp);
int next = tree[now].next[tmp];
if(next==-1){
next=++tot;
tree[next].v = -1;
tree[next].init();
tree[now].next[tmp]=next;
}
now = next;
}
tree[now].v = 0;
}
int query(char a[],int len)
{
int now = 0;
for(int i=0;i<len;i++){
int tmp = a[i]-'0';
int next=tree[now].next[tmp];
//printf("%d %d %d\n",now,tree[now].next[0],tree[now].next[1]);
if(tree[now].next[0]==-1&&tree[now].next[1]==-1&&now!=0) return 1;
if(i==len-1&&next!=-1) return 1;
if(next==-1) return 0;
now = next;
}
return 1;
}
int main()
{
int t = 1;
int flag = 1;
for(int i=0;i<20;i++) tree[i].init();
while(scanf("%s",str)!=EOF)
{
if(strcmp(str,"9")==0)
{
if(flag) printf("Set %d is immediately decodable\n",t++);
else printf("Set %d is not immediately decodable\n",t++);
flag = 1; tot = 0;
for(int i=0;i<20;i++) tree[i].init();
}
else
{
if(flag&&query(str,strlen(str))==0) {add(str,strlen(str));}
else flag = 0;
}
}
return 0;
}