[백준] 16916번 부분 문자열 (c++, kmp)
728x90
반응형
여러 번 공부하고도 이해못했는데 결국 피하지 못해 풀었다
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include <vector>
#include <string>
using namespace std;
int ans = 0;
//aabaa의 경우 a, aa, aab, aaba, aabaa 로 보는데 한글자인 a는 접두사,접미사가 같은걸로 보지 않음
// 따라서 i는 1부터 시작한다.
vector<int> makeTable(string p) {// 패턴문자의 접두사 접미사 구하기
int psize = p.length();
vector<int> table(psize, 0);
int j = 0;
for (int i = 1; i < p.size(); i++) {//1~m
while (j > 0 && p[i] != p[j]) {
j = table[j - 1];// 길이만큼 뛰어넘는다
}
if (p[i] == p[j]) {
table[i] = ++j;
}
}
return table;
}
void kmp(string s, string p) {
vector<int> table = makeTable(p);//접미사, 접두사 길이 구하기
int psize = p.size();
int ssize = s.size();
int j = 0;
for (int i = 0; i < ssize; i++) {
while (j > 0 && s[i] != p[j]) {
j = table[j - 1];
}
if (s[i] == p[j]) {
if (j == psize - 1) {//패턴길이가 3일때 j가 0,1,2가 같으면 3글자가 같으니 검사끝
ans = 1;
j = table[j];
return;
}
else {
j++;
}
}
}
}
int main(int argc, char** argv)
{
string s, p;
cin >> s >> p;
kmp(s, p);
cout << ans << endl;
return 0;//정상종료시 반드시 0을 리턴해야합니다.
}
728x90
반응형
'백준' 카테고리의 다른 글
[백준] 1941번 소문난 칠공주 (C++, 백트래킹) (0) | 2021.10.26 |
---|---|
[백준] 3090번 차이를 최소로 (c++, 이분탐색) (0) | 2021.10.18 |
[백준] 20920번 영단어 암기는 괴로워 (C++, hash, vector, sort) (0) | 2021.10.13 |
[백준] 16165번 걸그룹 마스터 준석이 (C++, 해시) (0) | 2021.10.08 |
[백준] 7795번 먹을 것인가 먹힐 것인가 (C++, 정렬 혹은 이분탐색) (0) | 2021.10.08 |
TAGS.