题意:在多个字符串里寻找,若他们至少有一个串是另一个串的前缀,则按题目要求输出语气
思路:建立字典树,因为只有0 1两数,数组开2大就行,判断是前缀的方法:每次插入一个字符串,在字典树中查询,若当到达已经存在了的字符串,即cur->cnt==1 ,也就是插入字符串的前缀,或者在字典树中能够找到插入的字符串
代码:
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#include <cstdlib>
#define lson l,mid,num<<1
#define rson mid+1,r,num<<1|1
using namespace std;
const int M=100005;
struct node
{
int cnt;
node *child[2];
node()
{
cnt=0;
for(int i=0; i<2; i++)
child[i]=NULL;
}
};
char a[15];
int flag;
node *root,*cur,*newnode;
void insert(char *a)
{
cur=root;
int len=strlen(a);
for(int i=0; i<len ; i++)
{
int index=a[i]-'0';
if(cur->child[index]!=NULL)
{
cur=cur->child[index];
if(cur->cnt==1 || i==len-1)
{
flag=0;
break;
}
}
else
{
newnode=new node;
cur->child[index]=newnode;
cur=newnode;
}
}
cur->cnt=1;
}
void del(node *head)
{
for(int i=0; i<2; i++)
if(head->child[i]!=NULL)
del(head->child[i]);
delete(head);
}
int main()
{
int g=1;
while(scanf("%s",a)!=EOF)
{
flag=1;
root=new node;
insert(a);
while(scanf("%s",a)!=EOF)
{
if(strcmp(a,"9")==0)break;
{
if(!flag)
continue;
insert(a);
}
}
if(flag)printf("Set %d is immediately decodable\n",g++);
else
printf("Set %d is not immediately decodable\n",g++);
del(root);
}
return 0;
}