※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 13220번 문제인 Secret이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/13220 

 

13220번: Secret

Alice needs to send a secret password to Bob. The password consists of N​space-separated integers. She decides to use a messenger, Eve, to send the password. To ensure that Eve does not steal the password, Alice uses a method of encoding she invented --

www.acmicpc.net

이러한 형태의 문제는 첫번째 수열을 두번 연속 이어붙인 수열에 두번째 수열이 존재하는지를 확인하는 것으로 문제를 해결할 수 있다.

 

이는 KMP 알고리즘을 이용해 선형시간에 해결가능하다.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;

int N;
int A[300001];
int pi[300001];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> N;
	for (int i = 0; i < N; i++) cin >> A[i + N + 1];
	for (int i = 0; i < N; i++) A[i + 2 * N + 1] = A[i + N + 1];
	for (int i = 0; i < N; i++) cin >> A[i];
	A[N] = 2000000007;

	bool chk = 0;
	for (int i = 0; i <= 3 * N; i++) {
		int idx = i;
		while (idx > 0) {
			if (A[pi[idx - 1]] == A[i]) break;
			idx = pi[idx - 1];
		}
		if (idx == 0) pi[i] = 0;
		else pi[i] = pi[idx - 1] + 1;

		if (pi[i] == N) chk = 1;
	}

	if (chk) cout << "YES";
	else cout << "NO";
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 13244 // C++] Tree  (0) 2023.05.31
[BOJ 13243 // C++] Non-decreasing subsegment  (0) 2023.05.30
[BOJ 13219 // C++] Trains  (0) 2023.05.28
[BOJ 13218 // C++] Bitcoin  (0) 2023.05.27
[BOJ 13217 // C++] Honey  (0) 2023.05.26

+ Recent posts