题意:给定一些01序列,判断是否存在某个序列是另外一个序列的前缀。第一次写字母树,没用动态分配内存,代码还需完善。
注意判断在插入序列的时候既要判断当前序列是否为已经存在序列的前缀又要判断已经存在的序列是否为当前序列的前缀。
再写几道题,总结出一个自己的模板吧。
/*
静态内存分配的字典树
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 2
typedef struct Trie
{
int next[MAXN];
int cnt;
bool tail;
};
Trie f[1100];
int tot=0;
void TrieInit()
{
f[0].next[0]=1;
f[0].next[1]=2;
}
//0-->not used,1-->has been used
bool Insert(char *s)
{
int i,j,k,l,flag;
l=strlen(s);
flag=0;
k=0;//初始的根节点
for(i=0;i<l;i++)
{
if(f[k].next[s[i]-'0']!=0)
{
k=f[k].next[s[i]-'0'];
if(f[k].tail) return 1;
if(i==l-1)
{
flag=f[k].cnt;
f[k].tail=1;
}
f[k].cnt++;
}
else
{
tot++;
f[k].next[s[i]-'0']=tot;
k=tot;
if(f[k].tail) return 1;
if(i==l-1)
{
flag=f[k].cnt;
f[k].tail=1;
}
f[k].cnt++;
}
}
//if(flag) printf("%s\n",s);
return flag;
}
int main()
{
int i,j,k,t,m,n,T,flag;
char s[12];
T=0;
while(gets(s))
{
memset(f,0,sizeof(f));
tot=2;
flag=1;
TrieInit();
if(Insert(s)) flag=0;
while(gets(s))
{
if(strcmp(s,"9")==0) break;
if(flag)
if(Insert(s)) flag=0;
}
printf("Set %d is ",++T);
printf(flag?"immediately decodable\n":"not immediately decodable\n");
}
return 0;
}