Description
Examples: Assume an alphabet that has symbols {A, B, C, D}
The following code is immediately decodable:
A:01 B:10 C:0010 D:0000
but this one is not:
A:01 B:10 C:010 D:0000 (Note that A is a prefix of C)
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 <bits/stdc++.h> using namespace std; struct node { int next[2]; int cnt; bool isWord; void init() { cnt=0; isWord=false; memset(next,-1,sizeof(next)); } }T[100000]; int main() { int kase=0,tot=1,flag=1; char s[100]; T[0].init(); while(~scanf("%s",s)) { int len=strlen(s); if(s[0]!='9') { int i,p=0; for(i=0;i<len;i++) { int x=s[i]-'0'; if(T[p].next[x]==-1) { T[tot].init(); T[p].next[x]=tot++; } p=T[p].next[x]; T[p].cnt++; if(T[p].isWord) flag=0; //包含其它串 } T[p].isWord=true; if(T[p].cnt>1) flag=0; //包含于其它串 }else{ printf("Set %d is%simmediately decodable\n",++kase,flag?" ":" not "); T[0].init(); tot=1,flag=1; } } return 0; }
指针字典树:
题目数据范围小胡搞:#include<stdio.h> #include<string.h> #include<stdlib.h> #include<iostream> using namespace std; const int MAXN = 2; typedef struct Trie_Node { bool isCode; struct Trie_Node *next[MAXN]; }Trie; bool flag; void Trie_insert(Trie *root,char *str) { Trie *p=root; int len=strlen(str); for(int i=0;i<len;i++) { int k=str[i]-'0'; if(p->next[k]==NULL) { Trie *t=new Trie; for(int j=0;j<MAXN;j++) t->next[j]=NULL; t->isCode=false; p->next[k]=t; } else { if(p->next[k]->isCode) { flag=false; return; } } p=p->next[k]; } p->isCode=true; } void Trie_del(Trie *root) { for(int i=0;i<MAXN;i++) { if(root->next[i]!=NULL) Trie_del(root->next[i]); } free(root); } char str[15]; int main() { int iCase=0; while(scanf("%s",str)!=EOF) { iCase++; Trie *root=new Trie; for(int i=0;i<MAXN;i++) root->next[i]=NULL; root->isCode=false; flag=true; Trie_insert(root,str); while(scanf("%s",str)) { if(str[0]=='9') break; if(flag) Trie_insert(root,str); } if(flag) printf("Set %d is immediately decodable\n",iCase); else printf("Set %d is not immediately decodable\n",iCase); Trie_del(root); } return 0; }
#include <cstdio> #include <cstring> #include <cmath> #include <iostream> #include <algorithm> #include <string> #include <cstdlib> using namespace std; int main() { char str[20][20],temp[20]; int ansNum=1,cnt=0,i,j,flag=1,len,t; while(~scanf("%s",temp)) { if(temp[0]=='9') { for(i=1;i<cnt;i++) { if(!flag) break; for(j=i+1;j<=cnt;j++) { if(!flag) break; len=min(strlen(str[i]),strlen(str[j])); for(t=0;t<len;t++) { if(str[i][t]!=str[j][t]) { flag=1; break; } flag=0; } } } if(flag) printf("Set %d is immediately decodable\n",ansNum); else printf("Set %d is not immediately decodable\n",ansNum); cnt=0,flag=1,ansNum++; memset(str,0,sizeof(str)); } else { strcpy(str[++cnt],temp); getchar(); } } }
363



被折叠的 条评论
为什么被折叠?



