본문 바로가기

알고리즘

[백준] 18119 - 단어 암기

문제

준석이는 영어 단어를 외우려고 한다. 사전에는 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