제출 #1105271

#제출 시각아이디문제언어결과실행 시간메모리
1105271flashmtMatching (CEOI11_mat)C++17
100 / 100
180 ms47944 KiB
#include <bits/stdc++.h> #ifdef LOCAL #include "Debug.h" #else #define debug(...) 42 #endif using namespace std; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, m; cin >> n >> m; vector<int> a(n), pos(n), l(n), r(n); for (int i = 0; i < n; i++) { cin >> pos[i]; a[--pos[i]] = i; l[i] = i - 1; r[i] = i + 1; } vector<int> b(m); for (int &x : b) cin >> x; vector<int> prev(n, -1), next(n, -1); for (int i = n - 1; i >= 0; i--) { int x = a[i]; if (l[x] >= 0) prev[i] = pos[l[x]]; if (r[x] < n) next[i] = pos[r[x]]; if (l[x] >= 0) r[l[x]] = r[x]; if (r[x] < n) l[r[x]] = l[x]; } auto match = [&](vector<int> &a, int i, int j) { return (prev[j] < 0 || a[i] > a[i - j + prev[j]]) && (next[j] < 0 || a[i] < a[i - j + next[j]]); }; vector<int> pre(n, -1); for (int i = 0, j = -1; i < n; i++) { while (j >= 0 && !match(a, i, j)) j = j ? pre[j - 1] + 1 : -1; pre[i] = j++; } vector<int> ans; for (int i = 0, j = 0; i < m; i++) { while (j >= 0 && !match(b, i, j)) j = j ? pre[j - 1] + 1 : -1; if (j == n - 1) { j = pre[j]; ans.push_back(i - n + 1); } j++; } cout << size(ans) << endl; for (int x : ans) cout << x + 1 << ' '; }
#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...