KMP 알고리즘을 이용해서 풀 수 있는 문제다.
https://www.acmicpc.net/problem/1786
1786번: 찾기
첫째 줄에, T 중간에 P가 몇 번 나타나는지를 나타내는 음이 아닌 정수를 출력한다. 둘째 줄에는 P가 나타나는 위치를 차례대로 출력한다. 예컨대, T의 i~i+m-1번 문자와 P의 1~m번 문자가 차례로 �
www.acmicpc.net
#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 | 
