#29094: 一直解密95%的情書,想請教耳聰目明的大家,眼瞎的我到底錯那兒?


hungsunny30@gmail.com (SHAN-LIN HUNG)

學校 : 不指定學校
編號 : 144565
來源 : [140.120.43.111]
最後登入時間 :
2022-02-08 10:49:34
e975. 3. 情書解密 (Love) -- 2019年5月TOI練習賽新手組 | From: [116.241.106.159] | 發表日期 : 2022-01-28 21:48

#include<bits/stdc++.h>

using namespace std;

int main() {

string str;

string strA = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

string stra = "abcdefghijklmnopqrstuvwxyz";

 

getline(cin, str);

int i, j, k, length;

length = str.size();

int ary[length];

//string to number consistenly

for (i = 0; i < length; i++) {

for (j = 0; j < 26; j++) {

if (str[i] == strA[j] || str[i] == stra[j]) {

ary[i] = j;

break;

} else {

ary[i] = 100;

}

}

 

}

//decoding

for (k = 0; k < 26; k++) {

for (i = 0; i < length; i++) {

if (ary[i] != 100) {

int a = i;

int b = (i + 1) % length;

int c = (i + 2) % length;

int d = (i + 3) % length;

a = (ary[a] + k ) % 26;

b = (ary[b] + k ) % 26;

c = (ary[c] + k ) % 26;

d = (ary[d] + k ) % 26;

if (a == 11 && b == 14 && c == 21 && d == 4) {

cout << k;

k = 26;

break;

}

}

}

}

return 0;

}

 
#29097: Re:一直解密95%的情書,想請教耳聰目明的大家,眼瞎的我到底錯那兒?


linlincaleb@gmail.com (臨末之頌)

學校 : 新北市立板橋高級中學
編號 : 132772
來源 : [111.248.111.135]
最後登入時間 :
2023-04-01 22:41:13
e975. 3. 情書解密 (Love) -- 2019年5月TOI練習賽新手組 | From: [111.248.104.193] | 發表日期 : 2022-01-29 00:10

for (i = 0; i < length; i++) {

if (ary[i] != 100) {

int a = i;

int b = (i + 1) % length;

int c = (i + 2) % length;

int d = (i + 3) % length;

這裡如果i在很後面的話,你的bcd可能跑回前面,也就是說如果字串是 eaaaaaaaaaknudlov的話,是有問題的

 
#29099: Re:一直解密95%的情書,想請教耳聰目明的大家,眼瞎的我到底錯那兒?


linlincaleb@gmail.com (臨末之頌)

學校 : 新北市立板橋高級中學
編號 : 132772
來源 : [111.248.111.135]
最後登入時間 :
2023-04-01 22:41:13
e975. 3. 情書解密 (Love) -- 2019年5月TOI練習賽新手組 | From: [111.248.104.193] | 發表日期 : 2022-01-29 00:49



另一個問題:t dm為輸入字串時,你的

a = (ary[a] + k ) % 26;

b = (ary[b] + k ) % 26;

c = (ary[c] + k ) % 26;

d = (ary[d] + k ) % 26;

if (a == 11 && b == 14 && c == 21 && d == 4)

剛好成立(因為你對ary[b] + k取餘數(mod 26)時,數字剛好==14),所以你的程式會神奇的輸出18,但這明顯不是答案。如果你把不是英文字母的值設成1000,可能就會對了(?

反正建議多做一個判斷 if (a == 11 && b == 14 && c == 21 && d == 4 && ary[b] != 100 && ary[c] != 100 && ary[d] != 100)  // ary[a]就不用做了 因為前面判斷過

不然就賭測資太爛吧(X

 
#29100: Re:一直解密95%的情書,想請教耳聰目明的大家,眼瞎的我到底錯那兒?


linlincaleb@gmail.com (臨末之頌)

學校 : 新北市立板橋高級中學
編號 : 132772
來源 : [111.248.111.135]
最後登入時間 :
2023-04-01 22:41:13
e975. 3. 情書解密 (Love) -- 2019年5月TOI練習賽新手組 | From: [111.248.104.193] | 發表日期 : 2022-01-29 00:54



另一個問題:t dm為輸入字串時,你的

a = (ary[a] + k ) % 26;

b = (ary[b] + k ) % 26;

c = (ary[c] + k ) % 26;

d = (ary[d] + k ) % 26;

if (a == 11 && b == 14 && c == 21 && d == 4)

剛好成立(因為你對ary[b] + k取餘數(mod 26)時,數字剛好==14),所以你的程式會神奇的輸出18,但這明顯不是答案。如果你把不是英文字母的值設成1000,可能就會對了(?

反正建議多做一個判斷 if (a == 11 && b == 14 && c == 21 && d == 4 && ary[b] != 100 && ary[c] != 100 && ary[d] != 100)  // ary[a]就不用做了 因為前面判斷過

不然就賭測資太爛吧(X

#include<bits/stdc++.h>

 

using namespace std;

 

int main() {

srand(time(NULL));

 

string str;

 

string strA = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

 

string stra = "abcdefghijklmnopqrstuvwxyz";

 

 

 

getline(cin, str);

 

int i, j, k, length;

 

length = str.size();

 

int ary[length];

 

//string to number consistenly

 

for (i = 0; i < length; i++) {

 

for (j = 0; j < 26; j++) {

 

if (str[i] == strA[j] || str[i] == stra[j]) {

 

ary[i] = j;

 

break;

 

} else {

 

ary[i] = rand()+27;

 

}

 

}

 

 

 

}

 

//decoding

 

for (k = 0; k < 26; k++) {

 

for (i = 0; i < length; i++) {

 

if (ary[i] < 27) {

 

int a = i;

 

int b = (i + 1) % length;

 

int c = (i + 2) % length;

 

int d = (i + 3) % length;

 

a = (ary[a] + k ) % 26;

 

b = (ary[b] + k ) % 26;

 

c = (ary[c] + k ) % 26;

 

d = (ary[d] + k ) % 26;

 

if (a == 11 && b == 14 && c == 21 && d == 4) {

 

cout << k;

 

k = 26;

 

break;

 

}

 

}

 

}

 

}

 

return 0;

 

}

剛剛送了,是AC的,對的概率80%吧(我猜),測資沒有剛剛說的第一種情況

 

 
ZeroJudge Forum