※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 13220번 문제인 Secret이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/13220
13220번: Secret
Alice needs to send a secret password to Bob. The password consists of Nspace-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 |