#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |