NOIP200905潜伏者
試題描述
R國和S國正陷入戰火之中,雙方都互派間諜,潛入對方內部,伺機行動。歷經艱險后,潛伏于S國的R國間諜小C終于摸清了S國軍用密碼的編碼規則:
1)S國軍方內部欲發送的原信息經過加密后在網絡上發送,原信息的內容與加密后所的內容均由大寫字母‘A’—‘Z’構成(無空格等其他字母)。
2)S國對于每個字母規定了對應的“密字”。加密的過程就是將原信息中的所有字母替換為其對應的“密字”。
3)每個字母只對應一個唯一的“密字”,不同的字母對應不同的“密字”。“密字”可以和原字母相同。
例如,若規定‘A’的密字為‘A’,‘B’的密字為‘C’(其他字母及密字略),則原信息“ABA”被加密為“ACA”。現在,小C通過內線掌握了S國網絡上發送的一條加密信息及其對應的原信息。小C希望能通過這條信息,破譯S國的軍用密碼。小C的破譯過程是這樣的:掃描原信息,對于原信息中的字母x(代表任一大寫字母),找到其在加密信息中的對應大寫字母y,并認為在密碼里y是x的密字。如此進行下去直到停止于如下的某個狀態:
1)所有信息掃描完畢,‘A’—‘Z’所有26個字母在原信息中均出現過并獲得了相應的“密字”。
2)所有信息掃描完畢,但發現存在某個(或某些)字母在原信息中沒有出現。
3)掃描中發現掌握的信息里有明顯的自相矛盾或錯誤(違反S國密碼的編碼規則)。例如某條信息“XYZ”被翻譯為“ABA”就違反了“不同字母對應不同密字”的規則。
在小C忙得頭昏腦脹之際,R國司令部又發來電報,要求他翻譯另外一條從S國剛剛截取到的加密信息。現在請你幫助小C:通過內線掌握的信息,嘗試破譯密碼。然后利用破譯的密碼,翻譯電報中的加密信息。
輸入
共3行,每行為一個長度在1到100之間的字符串。第1行為小C掌握的一條加密信息。第2行為第1行的加密信息所對應的原信息。第3行為R國司令部要求小C翻譯的加密信息。輸入數據保證所有字符串僅由大寫字母‘A’—‘Z’構成,且第1行長度與第2行相等。
輸出
共1行。若破譯密碼停止時出現2,3兩種情況,請你輸出“Failed”(不含引號,注意首字母大寫,其它小寫)。否則請輸出利用密碼翻譯電報中加密信息后得到的原信息。
輸入示例
【輸入樣例1】
AA
AB
EOWIE
【輸入樣例2】
QWERTYUIOPLKJHGFDSAZXCVBN
ABCDEFGHIJKLMNOPQRSTUVWXY
DSLIEWO
【輸入樣例3】
MSRTZCJKPFLQYVAWBINXUEDGHOOILSMIJFRCOPPQCEUNYDUMPP
YIZSDWAHLNOVFUCERKJXQMGTBPPKOIYKANZWPLLVWMQJFGQYLL
FLSO
輸出示例
【輸出樣例1】Failed
【輸出樣例2】Failed
【輸入樣例3】NOIP
?
?
?
代碼:
?
#include<iostream> using namespace std; char ch[26]={'0'}; int main() {string str1,str2,str3;cin>>str1>>str2>>str3;//str1為密文,str2為明文,str3為需要翻譯的密文 int len1=str1.length(),len3=str3.length();//獲取密文的長度 if(len1<26){ cout<<"Failed";return 0;//若果密文的長度比26個字母長度短,就輸出Failed,終止程序 }for(int i=0;i<len1;i++){for(int j=0;j<i;j++){if(str2[i]==str2[j]&&str1[i]!=str1[j]){cout<<"Failed";//如果明文中有相同的字母但在密文中對應的字母不相同,程序錯誤輸出Failed,終止程序 return 0;}}ch[str1[i]-'A']=str2[i];}for(int i=0;i<len3;i++) cout<<ch[str3[i]-'A']; }?
?
轉載于:https://www.cnblogs.com/zsh2016/p/5545759.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的NOIP200905潜伏者的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: make file教程(转)
- 下一篇: CentOS 7 安装配置 NFS