UVA644 Immediate Decodability
Trie
Trie模板题
难度几乎相等的题 P2580 于是他错误的点名开始了
对于每组数据都清空树太浪费时间,所以我们只要在需要新点时预先把新点原有的数据清空即可。
剩下除了一些细节要注意,没啥要说的了
(luogu的标签系统有些迷啊)
#include<iostream> #include<cstdio> #include<cstring> using namespace std; struct data{ int nxt[2]; bool end; void clear() {nxt[0]=nxt[1]=0; end=0;} //清空原先的数据 }a[5000001]; //对于每个节点,存储它的下一个字母,以及是否是某个字母的结束符 char q[2000001]; int cnt; //节点编号 bool ok; inline void insert(){ int u=0,len=strlen(q); bool ins=0; //ins:是否插入新节点 for(int i=0;i<len;++i){ int p=q[i]-'0'; if(!a[u].nxt[p]){ //如果之前没有这个节点就插入 a[++cnt].clear(); a[u].nxt[p]=cnt; ins=1; } if(a[u].end) ok=1; //如果某个在它之前插入的单词是它的前缀 u=a[u].nxt[p]; //跳转到下一个 } if(!ins) ok=1; //如果它是某个在它之前插入的单词的前缀 a[u].end=1; } int main(){ int t=0; while(cin>>q){ if(q[0]=='9') { //一组数据的结束 printf("Set %d is ",++t); if(ok) printf("not "); printf("immediately decodable\n"); cnt=0; ok=0; a[0].clear(); //注意树根0也要清空 }else insert(); } return 0; }