description
acm小組最近開始出現一些內部矛盾,主要原因是samsara,sowicm與gestapolur對小組的命名產生了分歧,但是samsara和 sowicm是絕對不會屈服於gestapolur,所以他們暗中聯絡怎樣打敗gestapolur,但是為了不讓gestapolur發現他們的目的, 他們希望會程式設計的你用他們的規則對資訊進行加密,以利於他們更完美的戰勝gestapolur。
input
輸入包含約100組資料,每組資料報括四行,第一行和第二行有兩個長度相同的字串s1和s2,分別表示明文到密文的對應關係,第一行為明文本串s1, 第二行為對應加密關係字串s2,第三行為需要加密的明文本串s3,第四行為需要解密的密文字串s4。 (1<=length(s1)=length(s2),length(s3),length(s4)<255)
讀入以eof結束。
output
每組資料輸出兩行,每組第一行輸出s3對應的密文字串,第二行輸出s4對應的明文本串,對每一行輸出,如果出現未給出的明文到密文的對應關係或者對應關係有誤(乙個明文對應多個密文或多個明文對應乙個密文)就輸出「wrong」(不包括引號)。
sample input
abcdesample outputfghij
anc
fhi
wronghintacd
資料中給出所有字串只包含數字及大小寫字母。
source
csu monthly 2011 dec.
ac**:
#include
#include
#include
using
namespace
std;
int main()
for (string::size_type i = 0; i != s3.size(); i++)
}for (string::size_type i = 0; i != s4.size(); i++)
}cout
<< a1 << endl;
cout
<< a2 << endl;
a1.clear();
a2.clear();
}return
0;}
思路分析:
用四個string存四個輸入,兩個bool陣列分別處理明文和密文中的重複字元。
兩個輸出實際上是等價的,能解決第乙個輸出,第二個輸出也能採用同樣的方法。
以找出s3對應的輸出為例:
通過string的find函式和rfind函式來判斷s1的當前字元是否有重複。如果重複,兩函式返回的索引值必然是不相等的。然後判斷s2在兩個索引值的字元是否相同,如果不同,說明是「真的」出現了一對多的情況,對該字元進行標記。
在求s3對應的輸出a1時,先用find函式判斷當前s3中的字元是否存在於s1中,且是否被標記。如果存在且未被標記就將s2中對應位置的字元存入a1中。只要任一條件不滿足,a1即為wrong。
s2和s4同理。
這題一開始分析的不是很清楚,主要是這段話:
對每一行輸出,如果出現未給出的明文到密文的對應關係或者對應關係有誤(乙個明文對應多個密文或多個明文對應乙個密文)就輸出「wrong」(不包括引號)。一開始的想法是只要s1中出現重複字元s3對應的輸出就給wrong,s2、s4同理。交完果斷wa了。之後想只要s3中出現的字元在s1中不重複,就能輸出對應密文,s2、s4同理。依然是wa。交到懷疑人生後拿別人的ac**測試了一遍終於發現了隱藏的問題:即使s3中出現了s1裡的重複字元,也有可能不輸出wrong。只要重複字元對應的密文也是相同的即可,例如dd對ii。
估計我還需要重新學學語文orz
acm小組的貪吃蛇
最近acm小組養了一條貪食蛇,他們把它養在乙個可看成二維空間的盒子裡 因為它不會向高處爬嘛 今天小組裡的人都不知道出去幹什麼了,只留了n個食物 在箱子裡,但是它又必須按照小組成員給出的1.n的順序將食物吃完,貪食蛇的行進方式只能是向前,向後,向左,或者向右,而不能斜著走。請你幫它計算一 下它吃完這些...
ACM小組的成績排名
為了保證每位acmer學習的進度,檢驗其學習成果,每隔一段時間就要進行一次內部測驗。samsara被逼迫去評測,並且要給每個人乙個分數,自然作為弱菜的他是沒有時間和精力來進行排名統計了,希望會程式設計的你能幫他輸出前三名的成績。input 輸入包含若干組資料,每組資料都有兩行,第一行乙個正整數n 3...
ACM小組的古怪象棋
acm小組的samsara和staginner對中國象棋特別感興趣,尤其對馬 可能是因為這個棋子的走法比較多吧 的使用進行深入研究。今天他們又在 構思乙個古怪的棋局 假如samsara只有乙個馬了,而staginner又只剩下乙個將,兩個棋子都在棋盤的一邊,馬不能出這一半棋盤的範圍,另外這 一半棋盤...