문제
입력으로 주어지는 M개 문자열 중 집합 S에 포함되어 있는 문자열 중 적어도 하나의 접두사인 것의 개수 구하기
생각할 것
문자를 앞에서부터 순차적으로 검색해서 존재여부를 판단하므로 트라이를 사용해보자
코드
#include <iostream>
#include <vector>
using namespace std;
struct Trie {
Trie *node[26];
Trie() {
for (int i = 0; i < 26; i++) node[i] = NULL;
}
~Trie() {
for (int i = 0; i < 26; i++) {
if (node[i]) {
delete node[i];
}
}
}
void insert(string &str, int idx) {
if (idx == str.size()) return; // 문자열 끝까지 탐색 시 종료
if (node[str[idx] - 'a'] == NULL) node[str[idx] - 'a'] = new Trie(); // 해당 문자 노드가 없으면 추가
node[str[idx] - 'a']->insert(str, idx + 1);
}
bool find(string &str, int idx) {
if (idx == str.size()) return true; // 문자열 끝까지 탐색 시 true 리턴
if (node[str[idx] - 'a'] == NULL) return false; // 해당 문자 노드가 없으면 false 리턴
return node[str[idx] - 'a']->find(str, idx + 1);
}
};
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int N, M;
cin >> N >> M;
Trie *root = new Trie();
string str;
for (int i = 0; i < N; i++) {
cin >> str;
root->insert(str, 0);
}
int res = 0;
for (int i = 0; i < M; i++) {
cin >> str;
if (root->find(str, 0)) res++;
}
cout << res;
delete root;
return 0;
}
반응형
'Problem solving > BOJ' 카테고리의 다른 글
[BOJ] 5427. 불 (C++) (0) | 2023.08.08 |
---|---|
[BOJ] 2630. 색종이 만들기 (C++) (0) | 2023.08.08 |
[BOJ] 16172. 나는 친구가 적다 (Large) (C++) (0) | 2023.08.06 |
[BOJ] 16916. 부분 문자열 (C++) (0) | 2023.08.04 |