Online Judge/백준

[백준][C++] 18119: 단어 암기

vince joe 2020. 6. 21. 06:45

문제 링크: https://www.acmicpc.net/problem/18119

 

비트마스크 활용 문제입니다.

문자열을 마스크로 바꿔서 저장해둔 뒤, 쿼리가 발생할 때마다 모든 문자열과 현재 알고있는 알파벳 마스크를 적당히 연산을 해서 읽을 수 있는지 없는지 확인합니다.

읽을 수 있는지 없는지 체크하는 방법은 (현재 알고 있는 알파벳 마스크 & 단어 마스크) == 단어 마스크 가 되면 됩니다. 적당히 그림을 그려 보면 바로 이해가 되실겁니다.

 

#pragma GCC optimize ("Ofast")

#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
using namespace std;


int main()
{
#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
#endif

	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

	int n, m;
	cin >> n >> m;
	
	string s;
	vector<int> words(n);
	for (auto& w : words) {
		cin >> s;
		
		for (auto& c : s) {
			w |= 1 << (c - 'a');
		}
	}

	int brain = 0x3ffffff;

	int q;
	char ch;
	while (m--) {
		cin >> q >> ch;
		
		if (q == 1) {
			// forget
			brain &= ~(1 << (ch - 'a'));
		}
		else {
			// remember
			brain |= 1 << (ch - 'a');
		}


		int readable = 0;
		for (auto& w : words) {
			if ((brain & w) == w)
				++readable;
		}
		cout << readable << '\n';
	}


	return 0;
}

사실 문제를 대충 읽고 모음 관련 처리를 안했는데 통과가 됩니다.

'모음은 완벽하게 외웠기 때문에 절대 잊지 않는다'라는 것이 입력으로 자음이 절대 안들어온다는 의미같습니다. 게시판에 보니 그런 느낌의 답변이 있네요.

반응형