a081. 環形燈帶計分

簡單陣列字串模擬

時間限制 1000 ms ・ 記憶體限制 256 MB

題目描述

校慶舞台裝了 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。

二、每回合的操作順序

每回合依序做以下兩件事:

  1. 讀取這一回合的 m 個移動距離,讓第 i 條燈帶依照第 i 個距離移動。不同燈帶可以移動不同的距離與方向。
  2. 等到所有燈帶都移動完畢,才計算這一回合的分數。

第一回合從輸入的初始排列開始。第二回合以後,都從上一回合結束時的排列繼續移動,不會重新回到初始排列。

例如,某條燈帶最初是 abcd:

初始排列:                    abcd
第一回合向右移動 1 格後:     dabc
第二回合再向右移動 1 格後:   cdab

這兩回合的移動會累積,所以第二回合的結果是 cdab。

三、如何計算一回合的分數

將所有燈帶的字串上下排好,同一直行就是相同位置的燈格。對第 1 到第 n 個位置,各自做以下統計:

  1. 查看這個位置在 m 條燈帶上分別是哪些字母。
  2. 計算每個字母出現幾次。
  3. 取其中最大的出現次數,作為這個位置的分數。

假設某回合移動後,有 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

逐位置計分如下:

位置四條燈帶上的字母字母出現次數此位置的分數
1a、a、a、za 出現 3 次,z 出現 1 次3
2b、b、c、bb 出現 3 次,c 出現 1 次3
3c、c、d、dc、d 各出現 2 次2
4a、a、a、aa 出現 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

逐位置查看第二回合的結果:

位置三條燈帶上的字母此位置的分數
1d、a、b1
2a、b、c1
3b、c、d1
4c、d、a1

每個位置的三種字母都不同,第二回合得到 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 條本回合分數
1abcabcabcabc4 + 4 + 4 = 12
2cababcbcaabc2 + 2 + 2 = 6
3abcabcabcabc4 + 4 + 4 = 12

例如,第二回合的計分方式是:

位置四條燈帶上的字母出現最多的字母與次數此位置的分數
1c、a、b、aa 出現 2 次2
2a、b、c、bb 出現 2 次2
3b、c、a、cc 出現 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。

配分方式

子題配分比對方式
子題 160 分完整輸出需完全正確
子題 240 分完整輸出需完全正確

範例測資

範例輸入 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
請先登入後再提交程式碼

討論與題解

載入討論區…

更多