Submission #171945

#TimeUsernameProblemLanguageResultExecution timeMemory
171945AlexPop28Matching (CEOI11_mat)C++11
81 / 100
1898 ms65540 KiB
#include <bits/stdc++.h>
#define dbg() cerr <<
#define name(x) (#x) << ": " << (x) << ' ' <<

using namespace std;

bool Match(int k, int i, const vector<int> &p,
  const vector<int> &small, const vector<int> &big) {
  
  bool ret = true;
  ret &= big[k] == -1 || p[i] < p[i - k + big[k]];
  ret &= small[k] == -1 || p[i] > p[i - k + small[k]];
  return ret;
}

vector<int> GetPi(const vector<int> &p,
  const vector<int> &small, const vector<int> &big) {

  int n = p.size();
  vector<int> pi(n); 
  pi[0] = 0;
  int k = 0;
  for (int i = 1; i < n; ++i) {
    while (k != 0 && !Match(k, i, p, small, big)) k = pi[k - 1];
    if (Match(k, i, p, small, big)) ++k;
    pi[i] = k;
  }
  return move(pi);
}

int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);

  int n, m; cin >> n >> m;
  vector<int> p(n);
  for (int i = 0; i < n; ++i) {
    int s; cin >> s; --s;
    p[s] = i;
  }

  auto Comp = [&](int a, int b) {
    return p[a] < p[b];
  };
  vector<int> big(n, -1), small(n, -1);
  set<int, decltype(Comp)> vals(Comp);
  vals.emplace(0);
  for (int i = 1; i < n; ++i) {
    auto it = vals.emplace(i).first;
    if (it != vals.begin()) small[i] = *prev(it);
    if (next(it) != vals.end()) big[i] = *next(it);
  }

  auto pi = GetPi(p, small, big);
  vector<int> text(m);
  for (int i = 0; i < m; ++i) {
    cin >> text[i];
  }

  vector<int> ans;
  int k = 0;
  for (int i = 0; i < m; ++i) {
    while (k != 0 && !Match(k, i, text, small, big)) k = pi[k - 1];
    if (Match(k, i, text, small, big)) ++k;
    if (k == n) {
      ans.emplace_back(i - n + 1);
      k = pi[k - 1];
    }
  }

  cout << ans.size() << endl;
  for (int &x : ans) {
    cout << 1 + x << ' ';
  }
  cout << endl;
}
#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...