#문제 간단 정리

노골적으로 O(N+M) 가 걸리는 KMP 사용하라는 문제이다

 

 

#문제 해결 방법

https://dfdfg42.tistory.com/entry/KMP-C-%EC%BD%94%EB%93%9C

 

KMP C++ 코드

#include #include #include using namespace std;vector makePI(const string& pattern) { int m = pattern.size(); vector PI(m, 0); int k = 0; for (int i = 1; i 0 && pattern[k] != pattern[i]) k = PI[k - 1]; if (pattern[k] == pattern[i]) k++; PI[i] = k; } return

dfdfg42.tistory.com

 

KMP 코드를 활용하도록 하자

 

 

#전체 코드

 

#include <iostream>
#include <vector>
#include <string>

using namespace std;

vector<int> makePI(const string& pattern) {
    int m = pattern.size();
    vector<int> PI(m, 0);
    int k = 0;

    for (int i = 1; i < m; i++) {
        while (k > 0 && pattern[k] != pattern[i])
            k = PI[k - 1];
        if (pattern[k] == pattern[i])
            k++;
        PI[i] = k;
    }

    return PI;
}

void KMP(const string& text, const string& pattern) {
    int n = text.size();
    int m = pattern.size();
    vector<int> PI = makePI(pattern);
    int k = 0;

    vector<int> result;

    for (int i = 0; i < n; i++) {
        while (k > 0 && pattern[k] != text[i])
            k = PI[k - 1];
        if (pattern[k] == text[i])
            k++;
        if (k == m) {
            result.push_back(i - m + 1);
            k = PI[k - 1];
        }
    }

    cout << result.size() << "\n";
    for (int idx : result) {
        cout << idx + 1 << " "; 
    }
    cout << "\n";
}

int main() {
    string text, pattern;

    getline(cin, text);
    getline(cin, pattern);

    KMP(text, pattern);

    return 0;
}

'[백준] > C++' 카테고리의 다른 글

백준 2312번 수 복원하기 [C++]  (0) 2024.06.26
백준 11721번 열 개씩 끊어 출력하기 [C++]  (0) 2024.06.19
백준 9742번 순열 [C++]  (0) 2024.06.18
백준 1275번 커피숍2 [C++]  (0) 2024.06.16
백준 27498번 연애 혁명 [C++]  (0) 2024.06.06

+ Recent posts