알고리즘/백준(BOJ)

백준 - 1786 찾기

시나모온 2020. 7. 18. 22:28

문제 링크입니다 : https://www.acmicpc.net/problem/1786

 

1786번: 찾기

첫째 줄에, T 중간에 P가 몇 번 나타나는지를 나타내는 음이 아닌 정수를 출력한다. 둘째 줄에는 P가 나타나는 위치를 차례대로 출력한다. 예컨대, T의 i~i+m-1번 문자와 P의 1~m번 문자가 차례로 �

www.acmicpc.net

 

kmp 문제

 

 

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

using namespace std;

vector<int> getPi(string p) {
    int m = p.size();
    int j = 0;
    vector<int> pi(m, 0);
    for(int i = 1; i < m; i++) {
        while(j > 0 && p[i] != p[j]) {
            j = pi[j - 1];
        }
        if(p[i] == p[j]) {
            pi[i] = ++j;
        }
    }
    return pi;
}

vector<int> kmp(string s, string p) {
    vector<int> ret;
    vector<int> pi = getPi(p);
    int n = s.size();
    int m = p.size();
    int j = 0;

    for(int i = 0; i < n; i++) {
        while(j > 0 && s[i] != p[j]) {
            j = pi[j - 1];
        }
        if(s[i] == p[j]) {
            if(j == m - 1) {
                ret.push_back(i - m + 1);
                j = pi[j];
            } else {
                j++;
            }
        }
    }
    return ret;
}


int main() {
    string text, pattern;
    getline(cin, text);
    getline(cin, pattern);
    vector<int> answer = kmp(text, pattern);
    cout << answer.size() << '\n';
    for(const auto& el : answer) {
        cout << el + 1 << ' ' ;
    }


    return 0;
}

 

 

 

개발 환경 : vscode

지적, 조언, 질문 환영입니다! 댓글 남겨주세요~