본문 바로가기

알고리즘/백준

백준 1786번 찾기

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