RE #7 求助
查看原帖
RE #7 求助
365751
Mr_罗楼主2024/11/2 07:55

Lyndon 分解。

#include <bits/stdc++.h>
using namespace std;

// #define CF

#define ll long long
#define ul unsigned ll
#define LL __int128_t
#define db double
#define DB long db
#define pii pair<int, int>
#define fi first
#define se second
#define mkpr make_pair
#define mem(a, x) memset(a, x, sizeof(a))
#define rep(i, l, r) for (int i(l), i##End(r); i <= i##End; i = -~i)
#define per(i, r, l) for (int i(r), i##End(l); i >= i##End; i = ~-i)

template<typename T, typename U> void chkmx(T &_a, U _b) { if (_a < _b) _a = _b; }
template<typename T, typename U> void chkmn(T &_a, U _b) { if (_a > _b) _a = _b; }

constexpr int N = 600005;
constexpr ll mod = 998244353, INF = 0x3f3f3f3f3f3f3f3f;
int n, m, t;
ll a[N];
vector<int> ans;

void solve() {
    scanf("%d", &n), t = n;
    rep(i, 1, n) scanf("%lld", &a[i]);
    rep(i, 1, n) a[++t] = a[i];
    int i = 1, j, k; while (i <= t) {
        for (j = i, k = i + 1; a[j] <= a[k]; k++) j = (a[j] == a[k] ? j + 1 : i);
        while (i <= j) ans.emplace_back(i + k - j - 1), i += k - j;
    } rep(i, 2, ans.size()) if (ans[i - 1] >= n) { m = ans[i - 2] + 1; break; }
    rep(i, m, n + m - 1) printf("%d ", a[i]);
}

void init() {}

int main() {
    init();
    #ifdef CF
    int _; scanf("%d", &_);
    while (_--) solve();
    #else
    solve();
    #endif
    return 0;
}
2024/11/2 07:55
加载中...