PS

BOJ 14959 : Slot Machines

lickelon 2024. 11. 4. 22:39
  • 문제 링크 : boj.kr/1605
  • 난이도 : P3
  • 태그 : KMP

코드

#include <bits/stdc++.h>

#define all(x) (x).begin(), (x).end()

#define INF 987654321

using namespace std;

using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;

vector<int> getPi(vector<int> P) {
    int L = (int)P.size();
    vector<int> Pi(L,0);
    int j = 0;
    for(int i = 1; i < L; ++i) {
        while(j > 0 && P[i] != P[j])
            j = Pi[j-1];
        if(P[i] == P[j])
            Pi[i] = ++j;
    }
    return Pi;
}

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

    int n;
    cin >> n;
    vector<int> arr(n);
    for(auto &u : arr) cin >> u;
    reverse(all(arr));

    auto Pi = getPi(arr);
    int k, p;
    k = p = INF;
    for(int i = 0; i < n; i++) {
        int ck = n - (i+1);
        int cp = (i+1) - Pi[i];
        if(ck + cp < k + p) {
            k = ck;
            p = cp;
        }
    }
    cout << k << " " << p;

    return 0;
}

풀이

전체 배열을 뒤집게 되면 #1605와 비슷한 문제가 된다.

728x90

'PS' 카테고리의 다른 글

BOJ 11378 : 열혈강호 4  (0) 2024.11.06
BOJ 27524 : 점수 내기  (0) 2024.11.05
BOJ 27485 : Compress Words  (0) 2024.11.03
BOJ 3033 : 가장 긴 문자열  (0) 2024.11.02
BOJ 9249 : 최장 공통 부분 문자열  (0) 2024.11.01