1. 程式人生 > 其它 >LuoguP7534 [COCI2016-2017#4] Kartomat 題解

LuoguP7534 [COCI2016-2017#4] Kartomat 題解

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;
}