레야몬
[C++] 1786번 찾기 - 문자열, KMP 본문
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int cnt;
string text, pattern;
vector<int> Fail()
{
int m = pattern.length();
vector<int> pi(m);
pi[0]=0;
for(int i=1, j=0; i<m; i++) {
while(j>0 && pattern[i]!=pattern[j]) j=pi[j-1];
if(pattern[i] == pattern[j]) pi[i] = ++j;
}
return pi;
}
vector<int> KMP()
{
int m = pattern.length();
int n = text.length();
vector<int> pos;
vector<int> pi = Fail();
for(int i=0, j=0; i<n; i++) {
while(j>0 && text[i]!=pattern[j]) j=pi[j-1];
if(text[i] == pattern[j]) {
if(j==m-1) {
pos.push_back(i-m+2);
j = pi[j];
cnt++;
}
else j++;
}
}
return pos;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
getline(cin, text); getline(cin, pattern);
vector<int> pos = KMP();
cout << cnt << '\n';
for(int i=0; i<pos.size(); i++) cout << pos[i] << ' ';
return 0;
}
KMP 알고리즘은 처음 보는 알고리즘이라서 다른 사람이 설명해놓은 글을 참고했다. 참고한 사이트는 아래에 적어놨다.
<KMP 알고리즘>
https://ansohxxn.github.io/algorithm/kmp/
(C++) 문자열 검색 알고리즘 : KMP 알고리즘
🚀 서론
ansohxxn.github.io
<공백 포함 문장려 입력받기>
https://aeunhi99.tistory.com/114
[C++] 공백(띄어쓰기)포함 문자열 입력받기
1. getline 이용 int main() { string s; getline(cin, s); cout << s; } getline을 쓰면 알아서 공백 포함하여 문자열을 입력받는다. 2. cin.getline 이용 int main() { char s[100]; cin.getline(s,100,'\n'); c..
aeunhi99.tistory.com
※현재 고등학교 등교 중인 학생입니다. 이제 알고리즘을 본격적으로 공부하기 시작해서 아직 초보입니다. 혹시 제가 잘못 알고 있는 점이나 더 좋은 풀이 방법이 있어 댓글에 남겨주시면 감사히 하나하나 열심히 읽어보겠습니다. 좋아요, 단순한 댓글 한마디라도 저에겐 큰 힘이 됩니다! 감사합니다.
'알고리즘 > 백준' 카테고리의 다른 글
[C++] 2150번 Strongly Connected Component - 그래프 이론, 강한 연결 요소 (0) | 2022.10.05 |
---|---|
[C++] 2042번 구간 합 구하기 - 자료 구조, 세그먼트 트리 (0) | 2022.10.04 |
[C++] 1708번 볼록 껍질 - 기하학, 볼록 껍질 (0) | 2022.10.03 |
[C++] 1533번 길의 개수 - 수학, 분할 정복 (0) | 2022.10.03 |
[C++] 1019번 책 페이지 - 수학 (0) | 2022.10.03 |
Comments