#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define fi first
#define se second
#define pb push_back
#define pk pop_back
#define yes std::cout << "YES\n"
#define no std::cout << "NO\n"
int32_t size_pattern;
int32_t size_text;
int32_t k;
constexpr int32_t kMod = 1e9 + 7;
std::unordered_map<int32_t, int32_t> mp;
std::string s;
std::vector<int64_t> ans;
std::vector<int64_t> less;
std::vector<int64_t> greater;
bool Ok(const std::vector<int32_t>& s, ll j, ll i) {
if (i >= less.size()) {
return false;
}
ll ind_less = less[i] == -1 ? -1 : j - (i - less[i]);
ll ind_greater = greater[i] == -1 ? -1 : j - (i - greater[i]);
return (i != size_pattern) && !(j - i <= size_pattern && size_pattern <= j) &&
((ind_less == -1 || s[ind_less] < s[j]) && (ind_greater == -1 || s[ind_greater] > s[j]));
}
std::vector<int> prefix_function(const std::vector<int32_t>& s) {
int n = (int)s.size();
std::vector<int> p(n, 0);
for (int i = 1; i < n; i++) {
int cur = p[i - 1];
while (!Ok(s, i, cur) && cur > 0) cur = p[cur - 1];
if (Ok(s, i, cur)) p[i] = cur + 1;
if (p[i] == size_pattern) {
ans.push_back(i - size_pattern * 2 + 1);
}
}
return p;
}
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
// freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
std::cin >> size_pattern >> size_text;
std::vector<int32_t> pattern(size_pattern);
for (int32_t i = 0; i < size_pattern; ++i) {
int32_t x;
std::cin >> x;
pattern[x - 1] = i + 1;
}
less.resize(size_pattern, -1);
greater.resize(size_pattern, -1);
for (int32_t i = 1; i < size_pattern; ++i) {
if (pattern[i - 1] > pattern[i]) {
ll ind = i - 1;
while (less[ind] != -1 && pattern[less[ind]] > pattern[i]) {
ind = less[ind];
}
greater[i] = ind;
less[i] = less[ind];
} else {
ll ind = i - 1;
while (greater[ind] != -1 && pattern[greater[ind]] < pattern[i]) {
ind = greater[ind];
}
less[i] = ind;
greater[i] = greater[ind];
}
}
std::vector<int32_t> text(size_text);
for (int32_t i = 0; i < size_text; ++i) {
std::cin >> text[i];
}
auto kmp = pattern;
kmp.push_back(0);
for (auto num : text) {
kmp.push_back(num);
}
prefix_function(kmp);
std::cout << ans.size() << "\n";
for (auto x : ans) {
std::cout << x << " ";
}
}
# | 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... |