# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1240652 | tuankhoi | Matching (CEOI11_mat) | C++20 | 0 ms | 0 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], index[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() {
#define NAME "test"
if (fopen(NAME".inp", "r")) {
freopen(NAME".inp", "r", stdin);
freopen(NAME".out", "w", stdout);
}
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> index[i];
s[index[i]] = i;
L[i] = i - 1;
R[i] = i + 1;
}
s[n + 1] = 0;
for (int i = n; i >= 1; i--) {
mx[i] = index[L[s[i]]];
mn[i] = index[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;
}