제출 #874604

#제출 시각아이디문제언어결과실행 시간메모리
874604sleepntsheepXOR (IZhO12_xor)C++17
100 / 100
153 ms47336 KiB
#include <assert.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
 
#define int long long
#define N 250000
#define M 9000000
 
int n, x, z, zz;
int a[N+1];
int A[M], C[M][2], alloc = 1;
 
int min(int a, int b) { return a < b ? a : b; }
int max(int a, int b) { return a > b ? a : b; }
 
void insert(int v, int x, int j, int i)
{
    int b = (x >> j) & 1;
    A[v] = max(A[v], i);
    if (j >= 0)
    {
        if (!C[v][b]) C[v][b] = ++alloc;
        insert(C[v][b], x, j-1, i);
        A[v] = max(A[v], A[C[v][b]]);
    }
}
 
int query(int v, int x, long long y, int j)
{
    if (y <= 0) return A[v];
    int b = (x >> j) & 1, z = -1;
    if (j >= 0)
    {
        if ((1u << j) >= y)
        {
            z = max(A[C[v][b^1]], query(C[v][b], x, y, j-1));
        }
        else
        {
            z = query(C[v][b^1], x, y - (1ll << j), j-1);
        }
    }
    return z;
}
 
signed main(void)
{
    scanf("%lld%lld", &n, &x);
    for (int i = 1; i <= n; ++i) scanf("%lld", a+i), insert(1, a[i] ^= a[i-1], 30, i);
    for (int b, i = 0; i < n; ++i) if ((b = query(1, a[i], x, 30) - i) > z) z = b, zz = i + 1;
    assert(z);
    printf("%lld %lld", zz, z);
 
    return 0;
}
 


#if 0
#include <assert.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

#define int long long
#define N 250000
#define M 9000000

int n, x, z = -1, zz;
int a[N+2];
int A[M], C[M][2], alloc = 1;

int min(int a, int b) { return a < b ? a : b; }
int max(int a, int b) { return a > b ? a : b; }

void insert(int v, int x, int j, int i)
{
    int b = (x >> j) & 1;
    A[v] = max(A[v], i);
    if (j >= 0)
    {
        if (!C[v][b]) C[v][b] = ++alloc;
        insert(C[v][b], x, j-1, i);
        A[v] = max(A[v], A[C[v][b]]);
    }
}

int query(int v, int x, long long y, int j)
{
    if (!v) return -1;
    if (y <= 0) return A[v];
    int b = (x >> j) & 1, z = -1;
    if (j >= 0)
    {
        if ((1u << j) >= y)
        {
            z = max(A[C[v][b^1]], query(C[v][b], x, y, j-1));
        }
        else
        {
            z = query(C[v][b^1], x, y - (1ll << j), j-1);
        }
    }
    return z;
}

signed main(void)
{
    scanf("%lld%lld", &n, &x);
    insert(1, 0, 31, n+1);
    for (int i = n; i >= 1; --i)
    {
        scanf("%lld", a+i);
        a[i] ^= a[i+1];
        int b = query(1, a[i], x, 31) - i;
        if (b >= z) z = b, zz = i;
        insert(1, a[i], 31, i);
    }
    assert(z != -1);
    printf("%lld %lld", zz, z);

    return 0;
}

#endif

컴파일 시 표준 에러 (stderr) 메시지

xor.cpp: In function 'int main()':
xor.cpp:50:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   50 |     scanf("%lld%lld", &n, &x);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~
xor.cpp:51:39: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   51 |     for (int i = 1; i <= n; ++i) scanf("%lld", a+i), insert(1, a[i] ^= a[i-1], 30, i);
      |                                  ~~~~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...