「UVA644」 Immediate Decodability(Trie
阿新 • • 發佈:2018-11-09
題意翻譯
本題有多組資料.每組資料給出一列以"9"結尾的僅包含'0'和'1'的字串,如果裡面有一個是另一個的子串,輸出"Set &case is not immediately decodable",否則輸出"Set &case is immediately decodable".換行. case從1開始計數.
感謝@Fuko_Ibuki 提供的翻譯
題目描述
輸入輸出格式
輸入格式:輸出格式:
輸入輸出樣例
輸入樣例#1: 複製01 10 0010 0000 9 01 10 010 0000 9
Set 1 is immediately decodable Set 2 is not immediately decodable
題解
算是比較簡單的Trie題了吧。
首先因為懶得特殊處理,就先按長度排個序,然後從小到大列舉每個串,並且在結尾打標記。
如果經過了一個打過標記的點,說明之前有串是它的字首。
1 /* 2 qwerta 3 UVA644 Immediate Decodability 4 Accepted 5 程式碼 C++,0.99KB6 提交時間 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 }