Submission #364461

#TimeUsernameProblemLanguageResultExecution timeMemory
364461arnold518Matching (CEOI11_mat)C++14
100 / 100
1071 ms44184 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; typedef pair<ll, ll> pll; const int MAXN = 1e6; int N, M; int A[MAXN+10], B[MAXN+10], C[MAXN+10]; int fail[MAXN+10]; struct BIT { int tree[MAXN+10]; void update(int i, int k) { for(; i<=N; i+=(i&-i)) tree[i]+=k; } int query(int i) { int ret=0; for(; i>0; i-=(i&-i)) ret+=tree[i]; return ret; } }bit1, bit2; vector<int> comp; int main() { scanf("%d%d", &M, &N); for(int i=1; i<=M; i++) scanf("%d", &C[i]); for(int i=1; i<=M; i++) B[C[i]]=i; for(int i=1; i<=N; i++) scanf("%d", &A[i]); comp=vector<int>(A+1, A+N+1); sort(comp.begin(), comp.end()); for(int i=1; i<=N; i++) A[i]=lower_bound(comp.begin(), comp.end(), A[i])-comp.begin()+1; for(int i=2, j=1; i<=M;) { if(j<=M && bit2.query(B[j])==bit1.query(B[i])) { fail[i]=j; bit1.update(B[i], 1); bit2.update(B[j], 1); i++; j++; } else { if(j!=1) { for(int k=j-1; k>fail[j-1]; k--) { bit2.update(B[k], -1); bit1.update(B[i-k], -1); } j=fail[j-1]+1; } else i++; } } memset(bit1.tree, 0, sizeof(bit1.tree)); memset(bit2.tree, 0, sizeof(bit2.tree)); vector<int> ans; for(int i=1, j=1; i<=N;) { if(j<=M && bit2.query(B[j])==bit1.query(A[i])) { bit1.update(A[i], 1); bit2.update(B[j], 1); i++; j++; if(j==M+1) { ans.push_back(i-M); } } else { if(j!=1) { for(int k=j-1; k>fail[j-1]; k--) { bit2.update(B[k], -1); bit1.update(A[i-k], -1); } j=fail[j-1]+1; } else i++; } } printf("%d\n", ans.size()); for(auto it : ans) printf("%d ", it); printf("\n"); }

Compilation message (stderr)

mat.cpp: In function 'int main()':
mat.cpp:87:11: warning: format '%d' expects argument of type 'int', but argument 2 has type 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wformat=]
   87 |  printf("%d\n", ans.size());
      |          ~^     ~~~~~~~~~~
      |           |             |
      |           int           std::vector<int>::size_type {aka long unsigned int}
      |          %ld
mat.cpp:25:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   25 |  scanf("%d%d", &M, &N);
      |  ~~~~~^~~~~~~~~~~~~~~~
mat.cpp:26:31: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   26 |  for(int i=1; i<=M; i++) scanf("%d", &C[i]);
      |                          ~~~~~^~~~~~~~~~~~~
mat.cpp:28:31: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   28 |  for(int i=1; i<=N; i++) scanf("%d", &A[i]);
      |                          ~~~~~^~~~~~~~~~~~~
#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...