알고리즘/백준(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
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~