문제
준석이는 영어 단어를 외우려고 한다. 사전에는 N가지 단어가 적혀 있다. 모든 단어는 소문자이다. 단어 안에 있는 모든 알파벳을 알 때, 그 단어를 완전히 안다고 한다.
다음과 같은 쿼리들이 주어진다.
- 1 x : 알파벳 x를 잊는다.
- 2 x : 알파벳 x를 기억해 낸다.
처음에 모든 알파벳을 기억하는 상태고, 모음은 완벽하게 외웠기 때문에 절대 잊지 않는다.
각 쿼리마다 완전히 알고 있는 단어의 개수를 출력하여라.
입력
첫 번째 줄에는 정수 N (1 ≤ N ≤ 104)과 M (1 ≤ M ≤ 5×104)이 주어진다.
다음 N개의 줄에는 문자열이 하나씩 주어진다. 문자열의 길이는 103을 넘지 않는다.
다음 M개의 줄에는 정수 o와 문자 x가 한 줄씩 주어진다. o는 1, 2중 하나이고, x는 알파벳 소문자이다.
o가 1이면 x를 잊는다는 뜻이고, o가 2면 x를 기억해낸다는 뜻이다. o가 1일 때는 x를 기억하고 있었음이 보장되고, o가 2일 때는 x를 잊고 있었음이 보장된다.
출력
각 쿼리마다 정수 하나를 출력한다.
더보기
예제 입력 1
5 10
apple
actual
banana
brick
courts
1 l
1 b
1 c
1 n
2 l
2 b
1 s
2 c
2 s
2 n
예제 출력 1
3
1
0
0
1
1
1
3
4
5
#include<iostream>
#include<string>
#include<vector>
#include<bitset>
using namespace std;
int N, M;
vector<bitset<26>> wordList;
vector<bitset<26>> copyWordList;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> N >> M;
wordList.resize(N);
string str;
for (int i = 0; i < N; i++) {
cin >> str;
for (char c : str)
wordList[i][(size_t)c - 'a'] = true;
}
copyWordList = wordList;
int op;
char x;
while (M--) {
cin >> op >> x;
if (op == 1) {
for (int i = 0; i < N; i++) {
if (copyWordList[i][(size_t)x - 'a'] == true)
wordList[i][(size_t)x - 'a'] = false;
}
}
else {
for (int i = 0; i < N; i++) {
if (copyWordList[i][(size_t)x - 'a'] == true)
wordList[i][(size_t)x - 'a'] = true;
}
}
int cnt = 0;
for (int i = 0; i < N; i++) {
if (copyWordList[i] == wordList[i])
cnt++;
}
cout << cnt << '\n';
}
return 0;
}
'알고리즘' 카테고리의 다른 글
[프로그래머스] Level 3 - 종이접기 (0) | 2020.06.17 |
---|---|
[백준] 7579 - 앱 (0) | 2020.05.18 |
[코드업] 4684 - 자물쇠 (0) | 2020.05.02 |
[코드업] 2699 - 사투리 (0) | 2020.04.25 |
[코드업] 4039 - 놀이공원 (0) | 2020.04.17 |