num[i]:节点属性,表示在i节点是否为某个单词的结尾,即单词是否在这里结束,1是,0否。
突破口:
if(num[node]==1)
首先num[node]=1说明有单词是以node节点结束的,接下来搜索node下面是否有子节点,有的话说明有另外的单词以该单词为前缀,没有的话继续node++。
代码如下:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn=1e3+5;
int Trie[maxn][2]={0};
int num[maxn]={0};
char s[10][15];
int tot=1,flag;
void insert(int n)
{
int len,node,i,j;
len=strlen(s[n])-1;node=0;
for(i=0;i<=len;i++)
{
if(Trie[node][s[n][i]-'0']==0)
Trie[node][s[n][i]-'0']=tot++;
node=Trie[node][s[n][i]-'0'];
}
num[node]=1;
}
/*void inquire(int node)
{
if(flag==0)
return;
if(num[node]==1)
{
if(Trie[node][0]!=0||Trie[node][1]!=0)
flag=0;
//return;
}
if(node>tot)
return;
inquire(node+1);
}*/
int main()
{
int n,i,j,kase=1;
n=0;flag=1;
while(~scanf("%s",s[n]))
{
if(s[n][0]!='9')
{
insert(n);
n++;
}
else
{
n=0;
int node;
for(node=0;node<tot;node++)
{
if(num[node]==1)
{
if(Trie[node][0]!=0||Trie[node][1]!=0)
flag=0;
}
if(!flag)
break;
}
if(flag)
printf("Set %d is immediately decodable\n",kase++);
else printf("Set %d is not immediately decodable\n",kase++);
flag=tot=1;
memset(num,0,sizeof(num));
memset(Trie,0,sizeof(Trie));
}
}
return 0;
}