제출 #1240707

#제출 시각아이디문제언어결과실행 시간메모리
1240707dprtoMatching (CEOI11_mat)C++20
100 / 100
150 ms35624 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define Nando signed
#define demo main
#define F(i, l, r) for(ll i = l; i <= r; ++i)
#define E(i, l, r) for(int i = l; i >= r; --i)
#define MASK(i) (1 << (i))
#define BIT(x, i) (((x) >> (i)) & 1)
#define eb emplace_back
const ll mod = 1e9 + 7;
const int ars = 1e6 + 5;
const int ii = 1e9;
const ll il = 1e18;

int n, m, idx[ars], s[2 * ars], lt[ars], rt[ars], kmp[2 * ars];

struct linked_list {
    int n, *l, *r;

    linked_list(int n_) : n(n_), l(new int[n_ + 10]), r(new int[n_ + 10]) {
        F(i, 1, n) {
            l[i] = i - 1;
            r[i] = i + 1;
        }
    }

    void del(int i) {
        int l_ = l[i], r_ = r[i];
        r[l_] = r_;
        l[r_] = l_;
    }
};

bool check(int i, int j) {
    if(i == n + 1) return false;
    if(lt[i] and s[j - i + lt[i]] > s[j]) return false;
    if(rt[i] and s[j + rt[i] - i] < s[j]) return false;
    return true;
}

Nando demo() {
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    cin >> n >> m;
    F(i, 1, n) {
        cin >> idx[i];
        s[idx[i]] = i;
    }

    s[n + 1] = 0;
    F(i, n + 2, n + 1 + m) cin >> s[i];

    linked_list lk(n);
    E(i, n, 1) {
        lt[i] = idx[lk.l[s[i]]];
        rt[i] = idx[lk.r[s[i]]];
        lk.del(s[i]);
    }

    vector<int> res;
    int len;
    F(i, 2, n + m + 1) {
        if(i == n + 1) continue;
        len = kmp[i - 1];
        while(len > 0 and !check(len + 1, i)) len = kmp[len];
        if(check(len + 1, i)) kmp[i] = len + 1;
        if(i > n + 1 and kmp[i] == n) res.eb(i - 2 * n);
    }

    cout << res.size() << "\n";
    for(auto x : res) cout << x << " ";
    cout << "\n";


    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...