来源:POJ1056
还是字典树,是判断是否有字符是另一个的前缀,kuangbin的博客上说交立即码。。。有扯远了。。。看官别介意。
其实就是字典树的使用,只不过就是在build_Tree的时候就判断就好了?
下面是一些注意点:
1.注意一旦不成立了,下面就不用继续建树了。。。这样节约时间。
2.注意这些不是太容易找到结束的输入,注意多次用whilescanf
3.还有。。。注意指针啊。。。还是要多练练。。。
4.哦,对。。。注意多组数据的时候,这些指针较多的题目要释放指针啊。。。
恩恩,差不多这些。。。
AC代码(VJ提交):
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
typedef struct Trie_Node{
bool cover;
Trie_Node *next[2];
}Node;
bool flag;
void build(Node *root,char str[]){
Node *p=root;
int i=0;
for(i=0;i<strlen(str);i++){
if(p->next[str[i]-'0']==NULL){
Node *t=new Node;
t->next[0]=NULL;
t->next[1]=NULL;
t->cover=false;
p->next[str[i]-'0']=t;
}
else{
if(p->next[str[i]-'0']->cover){
flag=false;
return;
}
}
p=p->next[str[i]-'0'];
}
p->cover=true;
}
void del(Node *root){
for(int i=0;i<2;i++)
if(root->next[i]!=NULL)
del(root->next[i]);
free(root);
root=NULL;
}
int main(){
int k=1;
char str[50];
while(scanf("%s",str)!=EOF){
Node *root=new Node;
root->next[0]=NULL;
root->next[1]=NULL;
root->cover=false;
flag=true;
build(root,str);
while(scanf("%s",str)){
if(strcmp(str,"9")==0)break;
if(flag==true) build(root,str);
}
if(flag==true)printf("Set %d is immediately decodable\n",k);
else printf("Set %d is not immediately decodable\n",k);
del(root);
k++;
}
return 0;
}