단어들이 anta- -tica로 이루어져 있기 때문에.
a,n,t,i,c 중 하나도 모르면 모든 단어를 읽을 수 없다는 점을 이용해서 시간초과를 극복했다.
우선 모든 단어들을 한 벡터에 넣고 중복을 제거,
k개의 알파벳을 아는 모든 경우에 대해
a,n,t,i,c 중 하나라도 모르면 continue.
비트마스크를 이용하면 더욱 시간이 짧아진다고 한다.
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | #include<stdio.h> #include<iostream> #include<string> #include<vector> #include<algorithm> using namespace std; int n, k; vector<string>s; vector<vector<char>>arr; vector<vector<char>>arr2; vector<char>toknow; vector<int>know; int main() { //freopen("Text.txt", "r", stdin); cin >> n >> k; s.resize(n); arr.resize(n); arr2.resize(n); for (int i = 0; i < n; i++) { cin >> s[i]; } for (int i = 0; i < n; i++) { for (char x : s[i]) { arr[i].push_back(x); } } for (int i = 0; i < n; i++) { sort(arr[i].begin(), arr[i].end()); arr[i].erase(unique(arr[i].begin(), arr[i].end()), arr[i].end()); for (int j = 0; j < arr[i].size(); j++) { toknow.push_back(arr[i][j]); } } sort(toknow.begin(), toknow.end()); toknow.erase(unique(toknow.begin(), toknow.end()), toknow.end()); if (k >= toknow.size()) { cout << n; return 0; } else { know.resize(toknow.size()); for (int i = 0; i < know.size(); i++) { know[i] = 0; } for (int i = 0; i < k; i++) { know[i] = 1; } } sort(know.begin(), know.end()); int ans = 0; do { int Vknow = 0; bool can = true; for (int i = 0; i < toknow.size(); i++) { if (toknow[i] == 'a' || toknow[i] == 'n' || toknow[i] == 't' || toknow[i] == 'i' || toknow[i] == 'c') { if (know[i] == 0) { can = false; break; } } } if (can == true) { for (int i = 0; i < n; i++) { int cnt = 0; bool Vcan = true; for (int j = 0; j < arr[i].size(); j++) { if (Vcan == true) { if (arr[i][j] == 'a' || arr[i][j] == 'n' || arr[i][j] == 't' || arr[i][j] == 'i' || arr[i][j] == 'c') { cnt++; continue; } for (int k = 0; k < toknow.size(); k++) { if (arr[i][j] == toknow[k]) { if (know[k] == 1) { cnt++; } else { Vcan = false; break; } } } } else { continue; } } if (cnt == arr[i].size()) { Vknow++; } } } if (ans < Vknow) { ans = Vknow; } if (Vknow == n) { cout << n; return 0; } } while (next_permutation(know.begin(), know.end())); cout << ans; } | cs |
'BOJ' 카테고리의 다른 글
백준 1806 / 부분합 (0) | 2019.01.29 |
---|---|
백준 12100 / 2048 (Easy) (0) | 2019.01.29 |
백준 14391 / 종이 조각 (0) | 2019.01.24 |
백준 2580 / 스도쿠 (0) | 2019.01.22 |
백준 9663 / N-Queen (0) | 2019.01.21 |