Submission #49880

#TimeUsernameProblemLanguageResultExecution timeMemory
49880mra2322001XOR (IZhO12_xor)C++14
100 / 100
262 ms72324 KiB
//Solution by Ali-Amir Aldan
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cassert>
#include <cstdio>
#include <vector>
#include <cmath>
#include <map>
#include <set>

using namespace std;

#define MAXN 250003
#define MAXVER 13000000

int n, x, last;
int a[MAXN];

int link[MAXVER][2];
int val[MAXVER];

int main ()
{

	scanf ("%d%d", &n, &x);
	for (int i = 0, y; i < n; i++)
	{
		scanf ("%d", &y);
		a[i+1] = a[i]^y;
	}

	int res = 0, pos = 0;
	memset (val, 127, sizeof (val));

	for (int i = 0, j, k, bit; i < n; i++)
	{
		for (j = 29, k = 0; j >= 0; j--)
		{
			val[k] = min (val[k], i);
			bit = (a[i]>>j)&1;
			if (!link[k][bit])
				link[k][bit] = ++last,
				assert (last < (MAXVER));
			k = link[k][bit];
		}
		val[k] = min (val[k], i);

		for (j = 29, k = 0; j >= 0; j--)
		{
			bit = (a[i+1]>>j)&1;

			if (link[k][bit^1] && !((x>>j)&1))
				if (i+1-val[link[k][bit^1]]>res)
					res = i+1-val[link[k][bit^1]],
					pos = val[link[k][bit^1]];

			bit ^= (x>>j)&1;

			if (!link[k][bit]) break;

			k = link[k][bit];
		}

		if (j < 0 && i+1-val[k]>res)
			res = i+1-val[k],
			pos = val[k];
	}

	printf ("%d %d\n", pos+1, res);

	return 0;
}

Compilation message (stderr)

xor.cpp: In function 'int main()':
xor.cpp:26:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf ("%d%d", &n, &x);
  ~~~~~~^~~~~~~~~~~~~~~~
xor.cpp:29:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf ("%d", &y);
   ~~~~~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...