1. 程式人生 > >「UVA644」 Immediate Decodability(Trie

「UVA644」 Immediate Decodability(Trie

題意翻譯

本題有多組資料.每組資料給出一列以"9"結尾的僅包含'0'和'1'的字串,如果裡面有一個是另一個的子串,輸出"Set &case is not immediately decodable",否則輸出"Set &case is immediately decodable".換行. case從1開始計數.

感謝@Fuko_Ibuki 提供的翻譯

題目描述

PDF

輸入輸出格式

輸入格式:

輸出格式:

輸入輸出樣例

輸入樣例#1: 複製
01
10
0010
0000
9
01
10
010
0000
9
輸出樣例#1: 複製
Set 1 is immediately decodable
Set 2 is not immediately decodable

題解

算是比較簡單的Trie題了吧。

首先因為懶得特殊處理,就先按長度排個序,然後從小到大列舉每個串,並且在結尾打標記。

如果經過了一個打過標記的點,說明之前有串是它的字首。

 1 /*
 2     qwerta
 3     UVA644 Immediate Decodability
 4     Accepted
 5     程式碼 C++,0.99KB
6 提交時間 2018-10-19 15:04:58 7 耗時/記憶體 8 50ms, 0KB 9 */ 10 #include<algorithm> 11 #include<iostream> 12 #include<cstring> 13 #include<cstdio> 14 using namespace std; 15 string s[11]; 16 bool cmp(string qaq,string qwq){ 17 return qaq.length()<qwq.length();
18 } 19 struct emm{ 20 int nxt[2],tag; 21 }a[83]; 22 int main() 23 { 24 //freopen("a.in","r",stdin); 25 int t=0; 26 while(++t&&cin>>s[1]) 27 { 28 int n=1; 29 do{if(s[n][0]=='9')break; 30 }while(cin>>s[++n]); 31 n--; 32 sort(s+1,s+n+1,cmp); 33 int cnt=0; 34 memset(a,0,sizeof(a)); 35 int flag=0; 36 for(int c=1;c<=n&&!flag;++c) 37 { 38 int k=0; 39 for(int i=0;i<s[c].length();++i) 40 { 41 if(!a[k].nxt[s[c][i]-'0']) 42 a[k].nxt[s[c][i]-'0']=++cnt; 43 k=a[k].nxt[s[c][i]-'0']; 44 if(a[k].tag)flag++; 45 } 46 a[k].tag=1; 47 } 48 if(!flag) 49 printf("Set %d is immediately decodable\n",t); 50 else 51 printf("Set %d is not immediately decodable\n",t); 52 } 53 return 0; 54 }