본문 바로가기

PS/BOJ

[백준] Xor Sum

반응형

문제 : https://www.acmicpc.net/problem/13504

 

문제요약 : 각각의 테스트 케이스마다 수열의 연속된 부분 수열 중 XOR 합이 가장 큰 부분 수열의 XOR 합을 출력한다

 

조건 :

1. 테스트 케이스 수 1 ≤ T ≤ 10

2. 수열 크기 1 ≤ N ≤ 100,000

3. 수열의 각 숫자는 int 범위 안의 음이 아닌 정수 (=32비트 안의 음이 아닌 정수)

 

해설 :

풀다가 힘들어서 다른 블로그를 참조했다...

https://young02.tistory.com/62

 

XOR 합

템플릿.md Tip 런타임에러가 났었는데 trie_size 변수 초기화를 하지 않았다...(ㅠㅠ) int형이 32bit지만, 1bit를 부호비트로 사용하기 때문에 사실상 31bit까지의 수만 나타낼 수 있다. 여기서는 unsigned int를..

young02.tistory.com

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node{
    node *x, *y;
    node(node *a, node *b){x=a; y=b;}
};
node *root=new node(NULL, NULL);
void insert(node *w, ll bits, ll pos){
    if(pos==-1) return;
    if((1<<pos)&bits) {
        if(w->y==NULL) w->y=new node(NULL, NULL);
        insert(w->y, bits, pos-1);
    }
    else {
        if(w->x==NULL) w->x=new node(NULL, NULL);
        insert(w->x, bits, pos-1);
    }
}
ll query(node *t, ll a, ll pos, ll p){
    if(pos==-1) return p;
    if((1<<pos)&a){
        if(t->x==NULL) return query(t->y, a, pos-1, p);
        else return pow(2,pos)+query(t->x, a, pos-1, p);
    }
    else{
        if(t->y==NULL) query(t->x, a, pos-1, p);
        else return pow(2,pos)+query(t->y, a, pos-1, p);
    }
}
int main(){
    ll n, m, c;
    for(scanf("%lld",&n); n--;){
        ll cxor=0, pr=0;
        scanf("%lld",&m);
        vector<ll> t;
        for(ll i=0; i<m; i++){
            scanf("%lld", &c);
            cxor^=c;
            t.push_back(cxor);
            pr=max(pr,cxor);
        }
        for(ll i=0; i<t.size(); i++){
            insert(root, t[i], 31);
            pr=max(pr,query(root, t[i], 31, 0));
        }
        printf("%d\n",pr);
        root=new node(NULL, NULL);
    }
    return 0;
}

 

 
반응형

'PS > BOJ' 카테고리의 다른 글

[백준] GCD 곱  (0) 2019.09.23
[백준] 7대 난제 클리어  (1) 2019.09.18
[백준] 플립과 시프트  (0) 2019.07.14
[백준] 2561번 세 번 뒤집기  (1) 2019.02.25
[백준] 1604번 정사각형 자르기  (0) 2019.02.25