Submission #1248508

#TimeUsernameProblemLanguageResultExecution timeMemory
1248508xydwe12312XOR (IZhO12_xor)C++20
100 / 100
150 ms86592 KiB
#include<bits/stdc++.h>
using namespace std;

#define int long long
#define ll long long

const int mod = 1000000007; // 998244353;
const int N = 2e5 + 5;

struct Node {

	Node *links[2];
	int prefix;
	int min_value = 1e9;

	Node *getKey(int bit) {
		return links[bit];
	}

	bool containsKey(int bit) {
		return (links[bit] != NULL);
	}

	void createTrie(int bit, Node *node) {
		links[bit] = node;
	}

	void inc(Node *node) {
		node->prefix++;
	}

	void dec(Node *node) {
		node->prefix--;
	}
};

class Trie {

private:
	Node *root;

public:
	vector<int> bits;
	Trie() {
		root = new Node();
		bits = vector<int>(31, 0);
	}

	void add(vector<int> &bits, int i, Node* &node, int idx) {

		if (i < 0) {
			node -> min_value = min(node -> min_value, idx);
			return;
		}

		int bit = bits[i];

		if (!node->containsKey(bit)) node->createTrie(bit, new Node());

		Node* next = node->getKey(bit);
		add(bits, i - 1, next, idx);

		node -> min_value = min(node -> min_value, next -> min_value);

	}

	void insert(int n, int idx) {

		Node *node = root;

		int x = n;
		for (int i = 0; i < 31; i++) {
			bits[i] = (x & 1);
			x >>= 1;
		}

		add(bits, 30, node, idx);
	}

	int query(int x, int k)
	{

		Node *node = root;
		int _x = x;

		for (int i = 0; i < 31; i++)
		{
			bits[i] = (_x & 1);
			_x >>= 1;
		}

		int ans = 1e9, sum = 0;

		for (int i = 30; i >= 0; i--)
		{
			int bit = bits[i];
			if ((sum | (1 << i)) > k)
			{
				if (node->containsKey(1 - bit))
					ans = min(ans, node->getKey(1 - bit) -> min_value);
				if (node->containsKey(bit)) node = node->getKey(bit);
				else break;
			}
			else
			{
				sum |= (1 << i);
				if (node->containsKey(1 - bit)) node = node->getKey(1 - bit);
				else break;
			}
		}

		return ans;
	}
};

void solve() {

	int n, x; cin >> n >> x;

	vector<int> a(n);
	for (auto &i : a) cin >> i;


	for (int i = 1; i < n; i++) a[i] ^= a[i - 1];

	int idx = 1, len = 0;
	for (int i = 0; i < n; i++) {
		if (a[i] >= x) {
			len = i + 1;
		}
	}

	Trie trie;
	trie.insert(a[0], 0);

	for (int i = 1; i < n; i++) {
		int min_idx = trie.query(a[i], x - 1);
		if (i - min_idx > len) {
			len = i - min_idx;
			idx = i - len + 2;
		}
		trie.insert(a[i], i);
	}

	cout << idx << " " << len << "\n";
}

signed main() {
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	int t = 1; while (t--) solve();
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...