信息学奥赛一本通 1855:【09NOIP提高组】潜伏者 | OpenJudge NOI 1.7 11:潜伏者 | 洛谷 P1071 [NOIP2009 提高组] 潜伏者
生活随笔
收集整理的這篇文章主要介紹了
信息学奥赛一本通 1855:【09NOIP提高组】潜伏者 | OpenJudge NOI 1.7 11:潜伏者 | 洛谷 P1071 [NOIP2009 提高组] 潜伏者
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目鏈接】
ybt 1855:【09NOIP提高組】潛伏者
OpenJudge NOI 1.7 11:潛伏者
洛谷 P1071 [NOIP2009 提高組] 潛伏者
【題目考點】
1. 字符串
2. ASCII碼
【解題思路】
因為題中指明了:每個字母只對應一個唯一的“密字”,不同的字母對應不同的“密字”。因此明文字母和密文字母為一一對應的關系。
設數組ori與enc,初值都為’\0’。ori[i]指密文字母i對應的明文字母,enc[i]指明文字母i對應的密文字母。每找到新的一對對應關系:明文A對應密文B,則需要先檢查明文A是否已經有對應的密文字母(enc[A]是否不為’\0’),以及密文B是否有對應的明文字母(ori[B]是否不為’\0’)。
- 如果二者都沒有對應的字母,那么建立明文A與密文B的對應關系,讓enc[A] = B,ori[B] = A。每建立一對關系,做一次計數。
- 如果A或B已經存在與其對應的字母,而且對應關系不為“明文A對應密文B”,那么輸出Failed。
由于題目中有要求:如果發現存在某個(或某些)字母在原信息中沒有出現,則破譯失敗。所以每個密文字母都要有與其對應的明文字母,對應關系數量必須得等于26。
最后統計關系數量,如果達到26,則使用已經構建好的明文密文關系做字符串解密。如果關系數量小于26,則輸出Fail。
【題解代碼】
解法1:
#include<bits/stdc++.h> using namespace std; #define N 105 int main() {char s_e[N], s_o[N], s_n[N];//s_e:加密后字符串 s_o:原字符串 s_n:待加密字符串char ori[128] = {}, enc[128] = {};//ori[i]:ASCII碼為i的加密字符的原字符 enc[i]:ASCII碼為i的原字符對應的加密字符 初值都為'\0'cin >> s_e >> s_o >> s_n;int l1 = strlen(s_e), l2 = strlen(s_n), cn = 0;//cn:已經確定的加密關系的個數for(int i = 0; i < l1; ++i){if(ori[s_e[i]] == '\0' && enc[s_o[i]] == '\0')//如果不存在s_e[i]對應的明文,同時不存在s_o[i]對應的密文 {//建立對應關系:明文s_o[i]對應密文s_e[i] ori[s_e[i]] = s_o[i];enc[s_o[i]] = s_e[i];cn++;}else if(ori[s_e[i]] != s_o[i] || enc[s_o[i]] != s_e[i])//如果已有對應關系,且對應關系不為明文s_o[i]對應密文s_e[i] {cout << "Failed";return 0;}}if(cn != 26)//如果對應關系不足26對 {cout << "Failed";return 0;}for(int i = 0; i < l2; i++)//解密s_n字符串 cout << ori[s_n[i]];return 0; }總結
以上是生活随笔為你收集整理的信息学奥赛一本通 1855:【09NOIP提高组】潜伏者 | OpenJudge NOI 1.7 11:潜伏者 | 洛谷 P1071 [NOIP2009 提高组] 潜伏者的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言密码程序返回,想程序高手求助--用
- 下一篇: 源码编译mysql5.5_源码编译安装M