Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 9875 | Accepted: 4670 |
Description
Input
Output
Sample Input
01 10 0010 0000 9 01 10 010 0000 9
Sample Output
Set 1 is immediately decodable Set 2 is not immediately decodable
本题要求所给字符串是否有的是其他字符串的前缀。
可以想到字典树,字典树的一个分支记录一个字符串,叶子节点做相应的标记。如果在字典树上插入新字符串的时候经过先前的叶子节点标记,则说明以该节点为叶子节点的路径上的字符串是当前插入字符串的前缀;如果在字典树上插入新字符串的长度小于当前所在的分支,则说明当前插入字符串是经过当前路径的所有分支所标示的字符串的前缀。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; //定义字典树结构体 struct Trie { Trie* next[2]; int flag; Trie() { flag=0; next[0]=NULL,next[1]=NULL; } }; //***************************************************************** Trie *root; bool flag; //初始化root void init() { root=new Trie; //memset(root,0,sizeof(Trie)); } //***************************************************************** //***************************************************************** //将str插入以root为根节点的字典树中 void insert(char *str) { int len = strlen(str); Trie *s = root; for (int i = 0; i < len; i++) { if (s->next[str[i] - '0']) { if(s->next[str[i] - '0']->flag==1||str[i+1]=='\0') { flag=false; return ; } s = s->next[str[i] - '0']; } else { Trie* t = new Trie; s->next[str[i] - '0'] = t; s = t; } } s->flag = 1; } //***************************************************************** int main() { char str[15]; int tag=1; while(~scanf("%s",str)) { flag=true; root =new Trie; insert(str); while(scanf("%s",str)) { if(strcmp(str,"9")==0) break; if(flag)insert(str); } if(flag) printf("Set %d is immediately decodable\n",tag++); else printf("Set %d is not immediately decodable\n",tag++); } return 0; }