日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Message Decoding密码翻译

發布時間:2023/12/3 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Message Decoding密码翻译 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這是一道模擬題ex

其實每一道模擬題都很“簡單”,

這道題就是難在讀英文題!處理輸入!

真的我竟然花了幾個小時就只是為了看懂樣例!!orz

題目大意

考慮下面的01串序列:
0,00,01,10,000,001,010,011,100,101,110,0000,0001,···,1101,1110,00000,···
首先是長度為1的串,然后是長度為2的串,依此類推。
如果看成二進制,相同長度的后一個串等于前一個串加1。注意上述序列中不存在全為1的串。
你的任務是編寫一個解碼程序。

輸入格式:
可能有多組數據,對于每組數據,首先輸入一個編碼頭(保證只有一行),則上述序列的每個串依次對應編碼頭的每一個字符。接下來是編碼文本(可能有多行組成,你應當把它們拼成一個長長的01串)。編碼文本由多個小節組成,每個小節的前三個數字代表小節中每個編碼的長度(用二進制表示),然后是各個字符的編碼,以全1結束(例如,編碼長度為2的小節以11結束)。編碼文本以編碼長度為000的小節結束。

輸出格式:對于每組數據,輸出其編碼文本解碼后的結果。

樣例輸入輸出
Sample input
TNM AEIOU
0010101100011
1010001001110110011
11000
$#**
0100000101101100011100101000

Sample output
TAN ME
##*$

樣例解釋
我就只解釋第二個吧!
首先讀入編碼頭$#**\

$0
#00
*01
*10
\000

接著讀入前三個01字符,010意味著后面的編碼長度為2,
接著連續讀入00,找到#,
讀入00,找到#,
再讀入10找到*
最后讀入11表示結束

然后讀入前三個01字符,011意味著后面的編碼長度為3
先讀入000,找到\
又讀入111,結束

其次讀入前三個01字符,001意味著后面的編碼長度為1
先讀入0,找到$
又讀入1,結束

最后讀入000,代表這個樣例結束!

題解

首先通過翻譯我們能get到些什么玩意?
1.這個編碼頭只有一行,所以不用考慮斷行存儲的麻煩,但是空格等其它鬼玩意兒都要存!
2.三個01表示長度len,即連續讀入len個01字符再去get編碼頭,知道遇到連續len個全是1結束
3.全文(這一個數據)用000結束
4.多行編碼文本,我們要進行粘貼,去掉換行

其次因為讀取三個01字符表示len,最大就是111(十進制:7)
這說明了每個編碼頭的對應密文最大就是1111110,七位,
我們就可以開char數組進行儲存

接著len長度有幾個密文呢?
思考一下有i位01,每一位都有0/1兩種選擇,那么就一共有1<<i種,排除掉全是1的情況
也就是2i-1個

接著就只有你的代碼實現問題了。。。

代碼實現

注意處理一下:
由于輸入下一個編碼頭之前,要敲一個\n,
所以最后我們先讀入一下\n,再調用函數讀取編碼頭

#include <cstdio> #include <cstring> #define MAXN 10 char code[MAXN][1 << MAXN];char readchar () {while ( 1 ) {char ch = getchar ();if ( ch != '\n' && ch != '\t' && ch != ' ' )return ch;} } bool readhead () {memset ( code, 0, sizeof ( code ) );for ( int i = 1;i <= 7;i ++ )for ( int j = 0;j < ( 1 << i ) - 1;j ++ ) {char ch = getchar ();if ( ch == EOF ) return 0;if ( ch == '\n' || ch == '\t' ) return 1;code[i][j] = ch;}return 1; } int readkey ( int len ) {int v = 0;for ( int i = len - 1;i >= 0;i -- ) {char ch = readchar ();v += ( ch - '0' ) * ( 1 << i );}return v; }int main() {while ( 1 ) {bool f = readhead ();if ( ! f ) return 0;while ( 1 ) {int len = readkey ( 3 );if ( len == 0 ) break;while ( 1 ) {int ip = readkey ( len );if ( ip == ( 1 << len ) - 1 ) break;printf ( "%c", code[len][ip] );}}printf ( "\n" );scanf ( "\n" );}return 0; }

又到了say goodbye的時間了,好舍不得 ,我們下期再見!!

總結

以上是生活随笔為你收集整理的Message Decoding密码翻译的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。