22/7 的戶田純收到了來自牆壁的任務,她拿到了一些粉絲的來信,每封信上面都有署名,且署名最長不會超過 4 個字元。
為了確保戶田純有做為一個稱職的偶像讀完所有信,牆壁要求計算兩封信署名的特徵值,該值的計算方法為 $\sum_{i} s_i \times 8^ i$,其中 $s_i$ 為署名中第 $i$ 個字元的大寫 ASCII 值。
計算完後戶田純需要回報給牆壁哪一個署名的特徵值較小以及該特徵值,若兩者特徵值相同時則請視作第一個特徵值較小。
你作為戶田純的忠實粉絲,能幫助她完成此任務嗎?
以下為參考的解答,但其會獲得 WA,請在 edit distance 不多於 4 內將該程式碼修改正確:
#include <ctype.h> // toupper
#include <stdio.h>
#include <string.h> // memcpy
#define N 4
int T;
void solve() {
unsigned i;
char a[N * 2] = {};
char b[N * 2] = {};
struct T {
unsigned v, i;
} s1, s2;
scanf("%s%s", a, b);
s1.v = 0, s1.i = 1;
for (i = 0; i < sizeof('a'); ++i)
s1.v = s1.v + (((unsigned)toupper(a[i])) << (i * 3));
s2.v = 0, s2.i = 2;
for (i = 0; i < sizeof('b'); ++i)
s2.v = s2.v + (((unsigned)toupper(b[i])) << (i * 3));
if (s2.v < s1.v) {
memcpy(&s1, &s2, sizeof(T));
}
printf("%u %u\n", s1.v, s1.i);
}
int main() {
int kase;
scanf("%d", &T);
for (kase = 0; kase < T; ++kase) {
printf("Case %d: ",
kase //*!*/ 100 /*?*/
);
solve();
}
return 0;
}
輸入的第一行有一個正整數 $T$,代表有多少組信要檢查。
接下來的 $T$ 行,每行有兩個一空白隔開的字串 $p_i$ $q_i$ 代表要檢查的兩個署名。
輸出 $T$ 行,每行包含兩個整數 $v_i$, $i$,代表第 $i$ 個署名的特徵值較小,並且其特徵值為 $v_i$。
另外在每行的開頭請輸出 Case 0:
IOICamp 2023 Day1 pL
No. | Testdata Range | Score |
---|---|---|
1 | 0~31 | 100 |