Thứ Năm, 6 tháng 12, 2012

Problem Little Xor

Link: http://codeforces.com/problemset/problem/252/A

A. Little Xor
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
Little Petya likes arrays that consist of non-negative integers a lot. Recently his mom has presented him one such array consisting of n elements. Petya immediately decided to find there a segment of consecutive elements, such that the xor of all numbers from this segment was maximal possible. Help him with that.
The xor operation is the bitwise exclusive "OR", that is denoted as "xor" in Pascal and "^" in C/C++/Java.
Input
The first line contains integer n (1 ≤ n ≤ 100) — the number of elements in the array. The second line contains the space-separated integers from the array. All numbers are non-negative integers strictly less than 230.
Output
Print a single integer — the required maximal xor of a segment of consecutive elements.
Sample test(s)
input
5
1 2 1 1 2
output
3
input
3
1 2 7
output
7
input
4
4 2 4 8
output
14
Note
In the first sample one of the optimal segments is the segment that consists of the first and the second array elements, if we consider the array elements indexed starting from one.
The second sample contains only one optimal segment, which contains exactly one array element (element with index three).


Thuật toán: đơn giản chỉ là brute-force. Xét dãy các số trong khoảng từ i..j, temp = a[i] ^ a[i+1]^.....a[j]. res = max (res, temp).
Code:

/* 
    Coder : Nguyen Duc Tam 
    template for contest
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<set>
#include<vector>
#include<utility>
#include<map>
#include<list>
#include<queue>
#include<deque>
#include<stack>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#include<iomanip>
#include<ctime>
#include<cctype>

using namespace std;

/*
    define for statement loop
*/
#define REP(i, start, end, step) for(int i = start; i < end; i += step)
#define DOWN(i, start, end, step) for(int i = start; i > end; i -= step)
#define FOR(it,c) for(__typeof((c).begin()) it = (c).begin(); it != (c).end(); it++)
#define ALL(c) (c).begin(), (c).end()
#define SZ(x) ((int)(x).size())

/*
    define operator bit
*/
#define L(x,i) ((x) << (i))
#define R(x,i) ((x) >> (i))
#define AND(a,b) ((a) & (b))
#define OR(a,b) ((a) | (b))
#define XOR(a,b) ((a) ^ (b))
#define NOT(a) (~(a))
#define SB(x,i) (OR((x), L(1, (i))))    // x | 1 << i 
#define CB(x,i) (AND((x),NOT(L(1,(i))))) // x & ~(1 << i)
#define TB(x,i) (AND((x), L(1,(i))))    // x & (1 << i) 

/*
    define init data    
*/
#define FILL(a,val) memset(a,val,sizeof(a));
#define INIT(a,l,r,val) REP(i,l,r,1) (a)[i] = val;

/*
    define convert data
*/
#define DIG(c) (int)((c) - '0')
#define CHR(c) (char)((c) + '0')
#define LOW(c) (char)((c) + 32)
#define UPP(c) (char)((c) - 32)

/*
    define math function    
*/
#define sqr(a) (a) * (a)
#define abs(a) (a < 0 ? -(a) : (a))

/*
    define find element in container very fast.
*/
#define LO(c,x) lower_bound(ALL(c),x)   
#define UP(c,x) upper_bound(ALL(c),x)
#define IOF(c,x) distance((c).begin(), LO((c),x))
#define IOL(c,x) distance((c).begin(), UP((c),x))
#define IN(c,x) binary_search(ALL(c),x)
#define ER(c,x) equal_range(ALL(c),x)

/*
    define geo
*/
#define DIS(p,q) sqrt(sqr(p.x - q.x) + sqr(p.y - q.y)) // khoang cach Euclide
#define DIM(p,q) abs(p.x - q.x) + abs(p.y - q.y) // khoang cach mahatan


/*
    define constant
*/

#define EPS 1e-7
#define OO 1000000005
#define N 105

#define X first
#define Y second

struct Point
{
    double x, y;
    Point(){}
    Point(double x,double y):x(x), y(y){}   
};

struct Node
{
    int value;
    Node* next;
    Node(){}
    Node(int value, Node* next):value(value),next(next){}
};

struct Edge
{
    int src, dst, weight;
    Edge(){}
    Edge(int src, int dst, int weight):src(src), dst(dst), weight(weight){} 
    
};

struct Compare
{
    
    bool operator() (const int i, const int j)
    {
        return i > j;   
    }

    /*
    bool operator() (const Point& p, const Point& q)
    {
        return (p.x != q.x ? p.x < q.x : p.y < q.y);
    }   
    */
    /*
    bool operator()(const Edge& e, const Edge& f)
    {
        return  (e.weight != f.weight ? e.weight > f.weight : e.src != f.src ? 
            e.src < f.src : e.dst < f.dst); // inverse weight
    }
    */
};

    
const int DAY[13] = {-1,31,29,31,30,31,30,31,31,30,31,30,31};

const int dx4[4] = {-1, 0, 1, 0}; //U - R - D - L
const int dy4[4] = {0, 1, 0, -1};

const int dx8[8] = {-1, -1, 0, 1, 1, 1, 0, -1}; //U - UR - R - DR - D - DL - L - UL 
const int dy8[8] = {0, 1, 1, 1, 0, -1, -1, -1};

typedef pair<int,int> II;
typedef pair<II,int> III;
typedef long long LL;
typedef unsigned long long ULL;
typedef unsigned char UC; 

vector<int>::iterator it, low, up; // using lower_bound, upper_bound
pair<vector<int>::iterator, vector<int>::iterator > bound;  // using function equal_range(first, last, x)
Compare comp;
Point p[2];
int n, a[N], res = -1;

int main()
{
    #define Off  false
    if(Off)
    {
        freopen("input.txt","r",stdin);
        freopen("output.txt","w",stdout);
    }
    cin >> n;
    REP(i,0,n,1)
        cin >> a[i];
    REP(i,0,n,1)
    REP(j,i,n,1)
    {
        int temp = a[i];
        REP(k,i + 1,j + 1,1)
            temp ^= a[k];
        res = max(res, temp);
    }
    cout << res << endl;
    return 0;
}


Không có nhận xét nào:

Đăng nhận xét