题意:给出一组由0或1组成的字符串,组与组之间用9分隔开,然后判断如果这个组之间有前缀,那么输出not,否则输出is
题解:使用字典树,建树直接就可以判断,分为两种情况,第一种情况就是前缀在前面出现,直接判断val[u]是否存在,第二种情况是前缀在后面出现,那么就在建树的过程中看是否出现了新的结点,如果没有出现,说明也是可以的。
附上代码:
#include<bits/stdc++.h>
using namespace std;
const int maxnode=100;
const int sigma_size=2;
struct Trie{
int ch[maxnode][sigma_size];
int val[maxnode];
int sz;
void clear(){
sz=1;
memset(ch[0],0,sizeof(ch[0]));
}
int idx(char c){
return c-'0';
}
bool insert(char *s,int v){
int u=0,n=strlen(s),g=0,flag=0;
for(int i=0;i<n;i++){
int c=idx(s[i]);
if(!ch[u][c]){
g=1;
memset(ch[sz],0,sizeof(ch[sz]));
val[sz]=0;
ch[u][c]=sz++;
}
u=ch[u][c];
if(val[u]){
flag=1;
}
}
val[u]=v;
if(flag==1||g==0){
return false;
}else{
return true;
}
}
};
Trie trie;
int main()
{
char s[20];
int kase=1;
bool flag=true;
trie.clear();
while(~scanf("%s",s)){
if(s[0]=='9'){
if(!flag){
printf("Set %d is not immediately decodable\n",kase++);
} else{
printf("Set %d is immediately decodable\n",kase++);
}
trie.clear();
flag=true;
continue;
}
if(!trie.insert(s,1)){
flag=false;
}
}
return 0;
}