LuoguP7534 [COCI2016-2017#4] Kartomat 題解
阿新 • • 發佈:2021-12-15
LuoguP7534 [COCI2016-2017#4] Kartomat 題解
Content
火車站裡頭有一個售票機,其鍵盤可以看作是一個 \(4\times 8\) 的矩陣,其中第一行的前面三個鍵和最後一行的最後三個鍵都是 *
,剩餘的鍵按照從上到下,從左到右的順序依次按照 A~Z 的順序排列。售票機可以買去往 \(n\) 個城市的票。
現在你向售票機裡面輸入了一個長度為 \(k\) 的字串,售票機會將以這個字串為字首且長度 \(\geqslant k+1\) 的所有城市的名字中的第 \(k+1\) 個字母顯示在鍵盤中這個字母原來所在的位置上,其餘的鍵則用 *
代替,求最終鍵盤上的情況(按照前文所述的 \(4\times 8\) 矩陣的格式輸出)。
資料範圍:\(1\leqslant n\leqslant 50\) 。
Solution
先給大家推薦一個和這題完全一樣的題目:P4470,按照年份來看的話應該是 BJWC 蒯了 COCI 的。
然後話回正題。我們先比對一下看這個字串是否包含這個字首且長度 \(\geqslant k+1\),這題目中完全可以暴力一個一個字元比對,然後將所有滿足要求的字串的第 \(k+1\) 個字母儲存,最後直接輸出顯示了所有儲存的字母的鍵盤即可。
Code
這份程式碼原封不動地蒯過去可以直接過 P4470。
int n, vis[57], ans[27]; string s[57]; int main() { n = Rint; F(i, 1, n) {cin >> s[i]; vis[i] = 1;} cin >> s[n + 1]; int len = s[n + 1].size(); F(i, 1, n) F(j, 0, len - 1) if(s[n + 1][j] != s[i][j]) {vis[i] = 0; break;} F(i, 1, n) if(vis[i] && len != s[i].size() && !ans[s[i][len] - 'A']) ans[s[i][len] - 'A'] = 1; printf("***"); F(i, 0, 25) { putchar(ans[i] ? i + 'A' : '*'); if(i == 4 || i == 12 || i == 20) puts(""); } return printf("***"), 0; }