- toc {:toc}
๋ฌธ์
๋จ๊ทน์ ์ฌ๋ ๊น์ง๋ฏผ ์ ์๋์ ํ์๋ค์ด ๋๋๋ก์ด๋ฉด ๋ง์ ๋จ์ด๋ฅผ ์ฝ์ ์ ์๋๋ก ํ๋ ค๊ณ ํ๋ค.ย ๊ทธ๋ฌ๋ ์ง๊ตฌ์จ๋ํ๋ก ์ธํด ์ผ์์ด ๋ น์์ ๊ณง ํ๊ต๊ฐ ๋ฌด๋์ง๊ธฐ ๋๋ฌธ์, ๊น์ง๋ฏผ์ K๊ฐ์ ๊ธ์๋ฅผ ๊ฐ๋ฅด์น ์๊ฐ ๋ฐ์ ์๋ค. ๊น์ง๋ฏผ์ด ๊ฐ๋ฅด์น๊ณ ๋ ํ์๋, ํ์๋ค์ ๊ทธ K๊ฐ์ ๊ธ์๋ก๋ง ์ด๋ฃจ์ด์ง ๋จ์ด๋ง์ ์ฝ์ ์ ์๋ค. ๊น์ง๋ฏผ์ ์ด๋ค K๊ฐ์ ๊ธ์๋ฅผ ๊ฐ๋ฅด์ณ์ผ ํ์๋ค์ด ์ฝ์ ์ ์๋ ๋จ์ด์ ๊ฐ์๊ฐ ์ต๋๊ฐ ๋๋์ง ๊ณ ๋ฏผ์ ๋น ์ก๋ค.
๋จ๊ทน์ธ์ด์ ๋ชจ๋ ๋จ์ด๋ โantaโ๋ก ์์๋๊ณ , โticaโ๋ก ๋๋๋ค. ๋จ๊ทน์ธ์ด์ ๋จ์ด๋ N๊ฐ ๋ฐ์ ์๋ค๊ณ ๊ฐ์ ํ๋ค. ํ์๋ค์ด ์ฝ์ ์ ์๋ ๋จ์ด์ ์ต๋๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๋จ์ด์ ๊ฐ์ N๊ณผ K๊ฐ ์ฃผ์ด์ง๋ค. N์ 50๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๊ณ , K๋ 26๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์ ๋๋ 0์ด๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ๋จ๊ทน ์ธ์ด์ ๋จ์ด๊ฐ ์ฃผ์ด์ง๋ค. ๋จ์ด๋ ์์ด ์๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์๊ณ , ๊ธธ์ด๊ฐ 8๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 15๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค. ๋ชจ๋ ๋จ์ด๋ ์ค๋ณต๋์ง ์๋๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๊น์ง๋ฏผ์ด K๊ฐ์ ๊ธ์๋ฅผ ๊ฐ๋ฅด์น ๋, ํ์๋ค์ด ์ฝ์ ์ ์๋ ๋จ์ด ๊ฐ์์ ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ค.
ํ์ด
์ฒ์ ๋ฌธ์ ๋ฅผ ๋ดค์ ๋์๋ K๊ฐ๋ฅผ ๊ตณ์ด ์ฑ์ธ ํ์ ์์ด K๊ฐ ๋ณด๋ค ์๊ฒ ์ ํํ๋ฉด ๋๋ ๊ฒ์ด๋ผ ์๊ฐํ๋ฉด์ ๋ฌธ์ ๊ฐ ์ฝ๋ค๋ ์๊ฐ์ ํ์ง๋ง ๋ฌธ์ ๋ฅผ ์๋ชป ์ดํดํ ๊ฒ์ด๊ณ ์ค์์ ๊ทธ๋ ์ง ์์๋ค. ์ต๋๋ก ๋ง์ด ๋จ์ด๋ฅผ ๋ฐฐ์ธ ์ ์๋๋ก ํด์ผํ๊ธฐ ๋๋ฌธ์ K๊ฐ์ ์ํ๋ฒณ์ ์ ํํด์ผํ๋ค. K๊ฐ์ ์ํ๋ฒณ ์กฐํฉ์ ์ ํํด ํด๋น ์ํ๋ฒณ์ผ๋ก ๋จ์ด๋ฅผ ๋ฐฐ์ธ ์ ์๋์ง๋ฅผ ํ์ธํด์ผ ํ๋ค.
- ์ํ๋ฒณ์ ์ ์ฒด ์กฐํฉ์ ํ์ธํด ์ต๋๋ก ๋ฐฐ์ธ ์ ์๋ ๋จ์ด์ ๊ฐ์๋ฅผ ๋น๊ตํ๋ค. (๋ธ๋ฃจํธ ํฌ์ค ๋ฐฉ๋ฒ : ์์ฐจํ์, BFS, DFS)
- ๋ฐ๋ณตํด์ ์ ํํ๋ ํ์ K๊ฐ ์ ํด์ ธ ์๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ์ฌ๊ท์ ์ผ๋ก ์ ํํด์ผํ๋ค๋ ์ ์์ DFS๋ฅผ ์ ํํด ํ์ด
- ํ์ด ํ ๋ค๋ฅธ ํ์ด ๋ฐฉ์์ ํ์ธํด๋ณด๋ bitmask ๋ผ๋ ๋ฐฉ์์ด ์์๋ค. โ ์กฐ์ฌ ํ ์ถํ ํฌ์คํ
#include <bits/stdc++.h>
using namespace std;
int N, K, res=0, check[26] = {};
string alphabet = "bdefghjklmopqrsuvwxyz", pick;
vector<string> words;
// dfs๋ก ๋ชจ๋ ๊ฒฝ์ฐ์ ์ ์ฐพ์๋ณด๊ธฐ
void dfs(int depth, int start){
// a, n, t, i, c๋ ๋ฐ๋์ ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ ์ ์ธํ๊ณ k-5๊ฐ์ ์ํ๋ฒณ์ ์ ํํ์ ๊ฒฝ์ฐ
if (depth == K-5){
int num = 0;
// words์์ ๋จ์ด ํ๋์ฉ ๊ฐ์ ธ์ค๊ธฐ
for(int i=0; i<words.size(); i++){
int teach = 1;
// word ํ๋์ฉ ์ํ๋ฒณ์ด ๊ฒน์น๋ ๊ฒ์ด ์๋์ง ๊ฐ์ ํ์
for(auto ch : words[i]){
if (ch == 'a' || ch == 'n' || ch == 't' || ch == 'i' || ch == 'c')
continue;
if (check[int(ch)-97] == 0){
teach = 0;
break;
}
}
if (teach) num++;
}
res = max(res, num);
return;
}
// K-5๊ฐ ์ ํํ๊ธฐ ์ํ for๋ฌธ
for(int i=start; i<alphabet.size(); i++){
check[int(alphabet[i])-97] = 1;
dfs(depth+1, i+1);
check[int(alphabet[i])-97] = 0;
}
}
int main(){
ios::sync_with_stdio(true);
cin.tie(); cout.tie();
cin >> N >> K;
string str;
// str ์์ ์, ๋ค ๋นผ๊ณ ์ค๊ฐ๋ง ์ค๋ณต ์ ์ธํด์ ์ ์ฅ
for(int i = 0; i < N; i++){
map<char, int> temp;
string cut;
cin >> str;
str = str.substr(4, str.size()-4);
for(int j = 0; j < str.size(); j++){
temp[str[j]]=1;
}
for(auto ch : temp) cut += ch.first;
words.push_back(cut);
}
if (K < 5){
cout << 0 << endl;
return 0;
}
dfs(0, 0);
cout << res << endl;
return 0;
}์ฐธ๊ณ ๋ฌธํ
https://www.acmicpc.net/problem/1062