结构体版本
做了优化,比其他题解更压缩,去掉了很多不必要的功能,还有就是我个人觉得初学者的话还是写结构体的好,这样才能更好的理解trie树这种数据结构。
回归题目,题意就是给一组01组合的字符串,不断输入,要求判断是否是之前某个字符的前缀。这里思路就是在每个字符串输入结束后添加一个判断标志。这样子如果下一个字符串输入过程中碰到了,说明刚好前缀包含了之前的某个字符串,那么直接return NO即可;反之如果到底都没得话,就是YES
总结:一个trie树小模板题,需要你思维转一下,然后对模板进行一点点改进;也说明了一个道理,你写的程序要能为你所用,更多的是要掌握思想
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
struct trie{
int son[2];
int flag;
}a[100005];
int t=0,s=0;
bool ff;
string b;
void add(){
int i,l,p=0;
l=b.length();
for(i=0;i<l;i++){
if(a[p].son[b[i]-'0']==0)
a[p].son[b[i]-'0']=++t;
p=a[p].son[b[i]-'0'];
if(a[p].flag==1){
printf("Set %d is not immediately decodable\n",s);
ff=1;
}
}
a[p].flag=1;
}
int main(){
ios::sync_with_stdio(false);
while(cin>>b){
mem(a,0);
s++,t=0,ff=0;
add();
while(cin>>b&&b!="9"){
if(ff==1)continue;
add();
}
if(ff==0)printf("Set %d is immediately decodable\n",s);
}
}