Submission #204511

#TimeUsernameProblemLanguageResultExecution timeMemory
204511SaboonMatching (CEOI11_mat)C++14
100 / 100
926 ms40436 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int maxn = 1e6 + 10;

int a[maxn], b[maxn], h[maxn];
int fen[maxn];
int f[maxn];

int get(int idx){
	int ret = 0;
	for (; idx; idx -= idx & -idx)
		ret += fen[idx];
	return ret;
}

void add(int idx, int val){
	for (; idx < maxn; idx += idx & -idx)
		fen[idx] += val;
}

int main(){
	ios_base::sync_with_stdio(false);
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i++){
		int x;
		cin >> x;
		a[x - 1] = i;
	}
	vector<int> cmp;
	for (int i = 0; i < m; i++){
		cin >> h[i];
		cmp.push_back(h[i]);
	}
	sort(cmp.begin(), cmp.end());
	for (int i = 0; i < m; i++)
		h[i] = lower_bound(cmp.begin(), cmp.end(), h[i]) - cmp.begin() + 1;
	for (int i = 0; i < n; i++){
		add(a[i], +1);
		b[i] = get(a[i]);
	}
	for (int i = 0; i < n; i++)
		add(a[i], -1); // vitex
	f[0] = f[1] = 0;
	int k = 0;
	for (int i = 1; i < n; i++){
		add(a[i], +1);
		int now = get(a[i]);
		while (k > 0 and b[k] != now){
			for (int t = i - k; t < i - f[k]; t++)
				add(a[t], -1);
			k = f[k];
			now = get(a[i]);
		}
		k += (b[k] == now);
		f[i + 1] = k;
	}
	memset(fen, 0, sizeof fen);
	vector<int> ans;
	k = 0;
	for (int i = 0; i < m; i++){
		add(h[i], +1);
		int now = get(h[i]);
		while (k > 0 and b[k] != now){
			for (int t = i - k; t < i - f[k]; t++)
				add(h[t], -1);
			k = f[k];
			now = get(h[i]);
		}
		k += (b[k] == now);
		if (k == n){
			ans.push_back(i - k + 1);
			for (int t = i - k + 1; t < i - f[k] + 1; t++)
				add(h[t], -1);
			k = f[k];
		}
	}
	cout << ans.size() << '\n';
	for (auto it : ans)
		cout << it + 1 << " ";
	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...