KMP 알고리즘을 이용해서 풀 수 있는 문제다.
https://www.acmicpc.net/problem/1786
#include <iostream>
#include <string>
#include <vector>
using namespace std;
string s, t;
int cnt;
vector<int> position, pi;
void getPi();
void KMP();
int main(void) {
char c;
while ((c = getchar()) != '\n') {
s += c;
}
while ((c = getchar()) != '\n') {
t += c;
}
getPi();
KMP();
cout << position.size() << '\n';
for (auto i : position) {
cout << i << '\n';
}
return 0;
}
void getPi() {
pi.resize(t.size(), 0);
int j = 0;
for (int i = 1; i < t.size(); i++) {
while (j > 0 && t[i] != t[j]){
j = pi[j - 1];
}
if (t[i] == t[j]) {
pi[i] = ++j;
}
}
}
void KMP() {
int j = 0;
for (int i = 0; i < s.size(); i++) {
while (j > 0 && s[i] != t[j]) {
j = pi[j - 1];
}
if (s[i] == t[j]) {
if (j == t.size() -1) {
j = pi[j];
position.push_back(i - t.size() + 2);
}
else {
j++;
}
}
}
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 1103 게임 (0) | 2020.07.22 |
---|---|
백준 2250 트리의 높이와 넓이 (0) | 2020.07.21 |
백준 1238 파티 (0) | 2020.07.21 |
백준 9466 텀 프로젝트 (0) | 2020.07.20 |
백준 3197 백조의 호수 (0) | 2020.07.20 |