題意概括:給你一段原來截獲的英文密碼和與之對應的明文,如果密碼表非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,...