[๋ฐฑ์ค] [C++] ๐จโ๐ซ ๊ฐ๋ฅด์นจ 1062๋ฒ
๐ก ๋ฌธ์ ์ค๋ช

๋ฐฑํธ๋ํน์ ์ฌ์ฉํ์ฌ๋ ํ๋ฆฌ์ง๋ง, ๋นํธ๋ง์คํน ์ฐ์ต์ ์ํด ๋นํธ๋ง์คํน์ผ๋ก ํ์ด๋ณด๋๋ก ํ์.
๋นํธ๋ง์คํน ํ์ด๋ ๋ฐฑํธ๋ํน๋ณด๋ค ์ฝ 10๋ฐฐ ๋น ๋ฅด๋ค.
๋จ, ๋นํธ์ฐ์ฐ์ ๋ํ ๊ธฐ๋ณธ ์ง์์ ์์ด์ผ ์ฝ๋ ์ดํด๊ฐ ๊ฐ๋ฅํ๋ค.
๐ก 2์ง์ ํ๊ธฐ
์ซ์ ์์ โ0bโ ๋ฅผ ๋ถ์ธ๋ค.
int a = 0b101; // a = 5 (1*4 + 0*2 + 1*1)
cout << a << endl; // 5 ์ถ๋ ฅ
๐ก 2์ง์๋ก ์ถ๋ ฅ
ํค๋ํ์ผ : #include
bitset<๋นํธ์ ๊ฐ์="">(์ถ๋ ฅํ ๋ณ์)๋นํธ์>
int a = 5;
cout << bitset<10>(a) << endl; // 0000000101 ์ถ๋ ฅ
๐ก ๋นํธ๋ง์คํน์ ์ด์ฉํ ํ์ด
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define MAX
/*
๋นํธ๋ง์คํน (๋ฐฑํธ๋ํน์ด ํ์ ์์)
K๊ฐ์ ๊ธ์๋ฅผ ๊ฐ๋ฅด์น ๋, ์ฝ์ ์ ์๋ ๋จ์ด์ ๊ฐ์
antic ๋ ๋ฌด์กฐ๊ฑด ๋ค์ด๊ฐ์ผ ํจ -> K<5 ๋ผ๋ฉด ๋ต์ 0
๋ฏธ๋ฆฌ ๊ฐ ๋จ์ด์ ๋ํด ํ์ํ bit๋ฅผ ๋ง๋ค์ด๋๊ณ ,
ํ์ธํ ๋ ํ์ฌ bit์ ๋จ์ด์ bit๋ฅผ AND ์ฐ์ฐ์ ์ด์ฉํด ๋จ์ด์ bit์ ๊ฐ๋ค๋ฉด
๊ทธ ๋จ์ด๋ฅผ ๋ง๋ค ์ ์๋๊ฒ์ด๋ค.
*/
int N, K;
string words[50];
int wordsBit[50];
int ans;
void dfs(int bit, int level, int last){
// K๊ฐ์ ๊ธ์๋ฅผ ๊ฐ๋ฅด์ณค๋ค๋ฉด
if (level==K){
int cnt=0;
for (int i=0; i<N; i++){
if ((bit & wordsBit[i]) == wordsBit[i]) cnt++;
}
if(cnt==N){ // N๊ฐ ๋ชจ๋ ๊ฐ๋ฅํ๋ฉด ๋ฐ๋ก ์ข
๋ฃ
cout << N;
exit(0);
}
ans = max(ans, cnt); // ans ์
๋ฐ์ดํธ
}
// ์์ง ํ์ธ ์ํ ๋นํธ ์ค์ ํ์ฌ ์์ผ์ ธ์๋ ๋นํธ์ ๋ํด dfs
for (int i = last+1; i < 26; ++i){
// i๋ฒ ๋นํธ๊ฐ 0์ด๋ผ๋ฉด ์ผ์ฃผ๊ณ ์ฌ๊ท
if (!(bit & (1 << i)))
dfs(bit | (1 << i), level + 1, i);
}
}
int main(){
ios_base::sync_with_stdio(0); cin.tie(0);
cin >> N >> K;
for (int i=0; i<N; i++){
cin >> words[i];
}
// 5๊ฐ ๋ฏธ๋ง์ด๋ฉด ์ ๋ ๋ชป๋ง๋ค์
if (K<5) {
cout << 0;
exit(0);
}
int bit = 0b00000010000010000100000101; // 2์ง์๋ก a, c, i, n, t ์ผ์ค
// ๋ฏธ๋ฆฌ ๊ฐ ๋จ์ด์ ๋ํด ํ์ํ bit๋ฅผ ๋ง๋ค์ด๋๊ธฐ
for (int i=0; i<N; i++){
wordsBit[i] = 0b00000010000010000100000101;
string word = words[i];
// ๋ชจ๋ ๋จ์ด๋ "anta"๋ก ์์๋๊ณ , "tica"๋ก ๋๋๋๊น ๊ทธ ์ฌ์ด๋ง
for (int j=4; j<word.length()-4; j++){
wordsBit[i] |= 1 << (word[j]-'a'); // ์ํ๋ฒณ์ ๋ง๋ ๋นํธ๋ฅผ ์ผ์ฃผ๊ธฐ
}
// cout << bitset<26>(wordsBit[i]) << '\n'; // ๊ฐ ๋ฌธ์์ ๋นํธ๊ฐ ์ ๋๋์ง ํ์ธ
}
// ์ด๋ฏธ 5๊ฐ์ ๊ธ์๋ ๊ฐ๋ฅด์ณค์ผ๋ ์งํ๋๋ 5๋ก ์์, -1์ ๋ง์ง๋ง์ผ๋ก ์ฒดํฌํ ๋นํธ์ ์ธ๋ฑ์ค
dfs(bit, 5, -1);
cout << ans;
return 0;
}
๐ก ์ ์ถ ๊ฒฐ๊ณผ
20ms ๋์ ๋น ๋ฅธ ์๋๋ก ๋ต์ ๊ตฌํ ์ ์๋ค.

๋ฐฑํธ๋ํน์ ์ฌ์ฉํ ๋ค๋ฅธ ์ฌ๋๋ค์ ์๋

๐ก ๋ง๋ฌด๋ฆฌ
๋นํธ ๋ฌธ์ ๋ฅผ ๋ช๊ฐ ํ๋ค ๋ณด๋ ๋นํธ ์ฐ์ฐ์ ํ์ฉํ๋ ๋ฅ๋ ฅ์ด ์ข ์๊ฒผ๋ค.
๋์ผ๋ก ํ์ธํ๊ธฐ ํ๋ ๋ฐ, 0b์ bitset<>์ ์ฌ์ฉํ๋ฉด ์ค๊ฐ์ ๊ฐ์ ์ฒดํฌํด๋ณผ ์ ์์ด์ ์ข์ ๊ฒ ๊ฐ๋ค.