Submission #1240654

#TimeUsernameProblemLanguageResultExecution timeMemory
1240654tuankhoiMatching (CEOI11_mat)C++20
100 / 100
707 ms31700 KiB
#include <bits/stdc++.h>

using namespace std;

#ifdef LOCAL
#include "algo/debug.h"
#else
#define debug(...) 42
#endif

const int MAXN = 1e6 + 5;
int s[MAXN * 2], idx[MAXN], L[MAXN], R[MAXN], mx[MAXN], mn[MAXN];

void del(int val) {
  int l = L[val];
  int r = R[val];
  L[r] = l;
  R[l] = r;
}

int kmp[MAXN];
int n, m;

bool check(int i, int j) {
  if (i == n + 1) return 0;
  if (mx[i] && s[j - i + mx[i]] > s[j]) return 0;
  if (mn[i] && s[j - i + mn[i]] < s[j]) return 0;
  return 1;
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    cin >> idx[i];
    s[idx[i]] = i;
    L[i] = i - 1;
    R[i] = i + 1;
  }
  s[n + 1] = 0;
  for (int i = n; i >= 1; i--) {
    mx[i] = idx[L[s[i]]];
    mn[i] = idx[R[s[i]]];
    del(s[i]);
  }
  for (int i = n + 2; i <= n + m + 1; i++) {
    cin >> s[i];
  }
  vector<int> ans;
  for (int i = 2; i <= n + m + 1; i++) {
    if (i == n + 1) continue;
    int k = kmp[i - 1];
    while (k > 0 && !check(k + 1, i)) k = kmp[k];
    if (check(k + 1, i)) kmp[i] = k + 1;
    if (i > n + 1 && kmp[i] == n) ans.emplace_back(i - 2 * n);
  }
  cout << ans.size() << '\n';
  for (int i : ans) cout << i << ' ';
  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...