본문 바로가기
Problem solving/BOJ

[BOJ] 14426. 접두사 찾기 (C++)

by 겸 2023. 8. 7.

문제

입력으로 주어지는 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