題目描述
校慶舞台裝了 m 條環形燈帶,每條燈帶都有 n 個燈格。每個燈格的顏色以一個小寫英文字母(a 到 z)表示,相同字母代表相同顏色。
燈光秀共有 k 回合。每回合先依照控制器的指令移動燈帶上的顏色,再根據各條燈帶的顏色是否對齊來計分。你的任務是讀入最初的排列與每回合的移動指令,算出全部回合的總分。
一、燈帶的排列與循環移動
每條燈帶以一個長度為 n 的字串表示。字串由左到右依序對應第 1 到第 n 個位置。例如,abcd 表示第 1 格是 a、第 2 格是 b、第 3 格是 c、第 4 格是 d。
因為燈帶是環形的,顏色移動到一端之外時,會從另一端接回來,字元不會消失,字串長度也不會改變。
每次移動的距離以整數 d 表示:
| 移動距離 | 操作 | 從 abcd 開始的例子 |
|---|---|---|
| d > 0 | 向右循環移動 d 格 | d = 1 時,變成 dabc |
| d < 0 | 向左循環移動 -d 格 | d = -1 時,變成 bcda |
| d = 0 | 不移動 | 仍是 abcd |
向右移動時,最右邊的字元會接回最左邊;向左移動時,最左邊的字元會接回最右邊。例如,從 abcd 開始:
向右移動 2 格:abcd → dabc → cdab
向左移動 2 格:abcd → bcda → cdab
移動距離可以大於燈帶長度。 例如,一條燈帶有 4 格時,向右移動 4 格會回到原來的排列;向右移動 5 格的結果就和向右移動 1 格相同。因此,abcd 在 d = 5 時會變成 dabc。
二、每回合的操作順序
每回合依序做以下兩件事:
- 讀取這一回合的
m個移動距離,讓第i條燈帶依照第i個距離移動。不同燈帶可以移動不同的距離與方向。 - 等到所有燈帶都移動完畢,才計算這一回合的分數。
第一回合從輸入的初始排列開始。第二回合以後,都從上一回合結束時的排列繼續移動,不會重新回到初始排列。
例如,某條燈帶最初是 abcd:
初始排列: abcd
第一回合向右移動 1 格後: dabc
第二回合再向右移動 1 格後: cdab
這兩回合的移動會累積,所以第二回合的結果是 cdab。
三、如何計算一回合的分數
將所有燈帶的字串上下排好,同一直行就是相同位置的燈格。對第 1 到第 n 個位置,各自做以下統計:
- 查看這個位置在
m條燈帶上分別是哪些字母。 - 計算每個字母出現幾次。
- 取其中最大的出現次數,作為這個位置的分數。
假設某回合移動後,有 4 條燈帶,每條 4 格,排列如下:
位置: 1 2 3 4
第 1 條: a b c a
第 2 條: a b c a
第 3 條: a c d a
第 4 條: z b d a
逐位置計分如下:
| 位置 | 四條燈帶上的字母 | 字母出現次數 | 此位置的分數 |
|---|---|---|---|
| 1 | a、a、a、z | a 出現 3 次,z 出現 1 次 | 3 |
| 2 | b、b、c、b | b 出現 3 次,c 出現 1 次 | 3 |
| 3 | c、c、d、d | c、d 各出現 2 次 | 2 |
| 4 | a、a、a、a | a 出現 4 次 | 4 |
這一回合的分數是 3 + 3 + 2 + 4 = 12。
注意,第 3 個位置有兩種字母並列最多,這個位置仍然只得 2 分,不會把兩種字母的次數加起來。若某個位置的所有字母都不同,則該位置得 1 分;若全部相同,則得 m 分。
每個位置都要分開統計,最後把 n 個位置的分數加起來,才是這一回合的分數。
四、最後要輸出的結果
將第 1 到第 k 回合的分數相加,輸出總分。最初的排列不計分,每回合也只在移動完畢後計分一次。
輸入格式
第一行有三個正整數 m、n、k,分別代表燈帶數量、每條燈帶的燈格數,以及回合數。
接下來 m 行,第 i 行有一個長度為 n 的字串,表示第 i 條燈帶最初的排列。字串只包含小寫英文字母。
接下來 k 行,依序給出第 1 到第 k 回合的指令。每行有 m 個整數,第 i 個整數表示這一回合第 i 條燈帶的移動距離。
同一行的整數以空白分隔。輸入共 1 + m + k 行。
限制
- 1 ≤ m, n, k ≤ 30
- -100 ≤ 移動距離 ≤ 100
子題
- 子題一(60 分):m = 3。
- 子題二(40 分):無額外限制。
輸出格式
輸出一行,包含一個整數,代表全部 k 回合的分數總和。
範例一
範例輸入:
3 4 2
abcd
bcda
cdab
0 1 2
1 0 -1
範例輸出:
16
範例一說明
本例有 3 條燈帶,每條 4 格,共執行 2 回合。
第一回合的移動距離是 0 1 2:
| 燈帶 | 回合開始時的排列 | 移動指令 | 移動後的排列 |
|---|---|---|---|
| 第 1 條 | abcd | 不移動 | abcd |
| 第 2 條 | bcda | 向右移動 1 格 | abcd |
| 第 3 條 | cdab | 向右移動 2 格 | abcd |
三條燈帶都是 abcd,每個位置都有 3 個相同字母,所以第一回合得到 3 + 3 + 3 + 3 = 12 分。
第二回合的移動距離是 1 0 -1。這次要從第一回合結束時的排列繼續移動:
| 燈帶 | 回合開始時的排列 | 移動指令 | 移動後的排列 |
|---|---|---|---|
| 第 1 條 | abcd | 向右移動 1 格 | dabc |
| 第 2 條 | abcd | 不移動 | abcd |
| 第 3 條 | abcd | 向左移動 1 格 | bcda |
逐位置查看第二回合的結果:
| 位置 | 三條燈帶上的字母 | 此位置的分數 |
|---|---|---|
| 1 | d、a、b | 1 |
| 2 | a、b、c | 1 |
| 3 | b、c、d | 1 |
| 4 | c、d、a | 1 |
每個位置的三種字母都不同,第二回合得到 1 + 1 + 1 + 1 = 4 分。
兩回合總分為 12 + 4 = 16。
範例二
範例輸入:
4 3 3
abc
abc
bca
cab
0 0 1 -1
1 0 -1 0
-4 6 4 -6
範例輸出:
30
範例二說明
本例有 4 條燈帶,每條 3 格,共執行 3 回合。各回合移動完畢後的排列與分數如下:
| 回合 | 第 1 條 | 第 2 條 | 第 3 條 | 第 4 條 | 本回合分數 |
|---|---|---|---|---|---|
| 1 | abc | abc | abc | abc | 4 + 4 + 4 = 12 |
| 2 | cab | abc | bca | abc | 2 + 2 + 2 = 6 |
| 3 | abc | abc | abc | abc | 4 + 4 + 4 = 12 |
例如,第二回合的計分方式是:
| 位置 | 四條燈帶上的字母 | 出現最多的字母與次數 | 此位置的分數 |
|---|---|---|---|
| 1 | c、a、b、a | a 出現 2 次 | 2 |
| 2 | a、b、c、b | b 出現 2 次 | 2 |
| 3 | b、c、a、c | c 出現 2 次 | 2 |
第三回合的指令是 -4 6 4 -6。因為每條燈帶只有 3 格:
- 第 1 條從
cab向左移動 4 格,結果和向左移動 1 格相同,變成abc。 - 第 2 條從
abc向右移動 6 格,繞了兩圈,仍是abc。 - 第 3 條從
bca向右移動 4 格,結果和向右移動 1 格相同,變成abc。 - 第 4 條從
abc向左移動 6 格,繞了兩圈,仍是abc。
三回合總分為 12 + 6 + 12 = 30。
配分方式
| 子題 | 配分 | 比對方式 |
|---|---|---|
| 子題 1 | 60 分 | 完整輸出需完全正確 |
| 子題 2 | 40 分 | 完整輸出需完全正確 |
範例測資
範例輸入 1
3 4 2 abcd bcda cdab 0 1 2 1 0 -1
範例輸出 1
16
範例輸入 2
4 3 3 abc abc bca cab 0 0 1 -1 1 0 -1 0 -4 6 4 -6
範例輸出 2
30
討論與題解
載入討論區…