題解 洛谷P1071 潛伏者

2022-05-27 18:54:07 字數 1549 閱讀 3184

題意概括:給你一段原來截獲的英文密碼和與之對應的明文,如果密碼表非f♂a法,輸出"failed" ,否則翻譯現在給你的一句密文並輸出。(所有字母均為大寫)

有兩種情況視為密碼表非法:

1、 所有資訊掃瞄完畢,但發現有字母在原資訊中沒有出現(密碼表脫漏)。

2、 掃瞄中發現掌握的資訊裡有明顯的自相矛盾或錯誤(密碼表錯亂)。

這道題主要思想可以利用陣列打表,首先我們定義乙個陣列code作為密碼表

然後進行密碼表製作,比如乙個密文是「ddyakioi」,明文是「ssdpolkl」(首先宣告一點,這只是為了便於理解寫的短樣例,這個樣例實際上已經非法了)

可見code['d'](即code[68])為's',code['y']為'd',以此類推。

現有密文為"doai",根據一對一原則,翻譯出來就是"skpl"。

下面詳細解釋一下兩種非法情況:

一、密碼表脫漏

很好理解,就是有的密文位沒有相對應的明文本母。排除方法:因為本題常數較小,考慮使用直接掃瞄的方法判斷

二、密碼表錯亂

這種情況又分為兩種小情況:一對多和多對一

一對多:乙個密文位對應多個明文本母。排除方法:壓入明文製表過程中判斷,發現與當前佔位被不同字母搶占則判定非法

多對一:多個密文對應乙個明文本母。排除方法:全表從頭至尾掃瞄,發現與當前明文佔位不同明文相同的則判定非法

接下來是愉快的貼**時間,是好孩子的話就不要抄襲題解呢……(微笑)

1

//stand up for the faith!

2 #include3

using

namespace

std;

4#define ll long long56

char myst[400],word[400];7

char sent[400],code[400];8

//分別代表密文、明文、需譯語句、密碼表

9 signed main(void)10

19/*

此處明確幾點:

201、如果密文和明文長度不等,100%無法一一對應,視為非法

212、如果長度少於26,一定無法a-z全部對應,直接非法

223、如果長度多於26,不一定非法(比如有兩次等價對應)

*/23

for(int i=0;i)

2430

for(int j='

a';j<='

z';j++)

3137

}38 code[myst[i]]=word[i];39}

40for(int i='

a';i<='

z';i++)

4146

}47 scanf("%s"

,sent);

48int len=strlen(sent);

49for(int i=0;i)

5053 }

洛谷 P1071 潛伏者

題目描述 r 國和 s 國正陷入戰火之中,雙方都互派間諜,潛入對方內部,伺機行動。歷盡艱險後,潛伏於 s 國的 r 國間諜小 c 終於摸清了 s 用密碼的編碼規則 1 s 方內部欲傳送的原資訊經過加密後在網路上傳送,原資訊的內容與加密後所得的內容均由大寫字母 a z 構成 無空格等其他字元 2 s ...

題解 P1071 潛伏者

題目所述 如某條資訊 xyz 被翻譯為 aba 就違反了 不同字母對應不同密字 的規則。其實還有另外一種違反情況需要考慮 資訊 opo 被翻譯為 jkl 這時也要輸出failed。就像dna的鹼基對一樣。includeusing namespace std char s 120 sb 120 str...

洛谷 P1071 潛伏者 C語言題解

附上 include include include typedef struct dic int cnt 0 char a 101 char b 101 char message 101 int exist dic book,char n1,char n2 判斷在字典中是否已經存在,不存在返回0,...