【GZOJ】1314——异或最大值

来源:互联网 发布:日本烘焙大师 知乎 编辑:程序博客网 时间:2024/05/22 17:55

题目链接:广大OJ1314
本题亦为广大15级第一次周赛的G题。

题目内容

Problem Description
小布除了经常能在野外遇到不明生物外还非常喜欢由非负数组成的数组, 有一天他的获得了一个由n个非负数组成的数组

而小布想在数组中找到一段连续的数字,使得这段数字异或起来的值是最大的

例如这个数组是 1, 2, 5, 7, 8

那么 (2,5,7) 是一段连续的数字, 这段数字异或起来的值为 2 ^ 5 ^ 7 = 0

(1, 2) 也是一段连续的数字,这段数字异或起来的值为 1 ^ 2 = 3

其中异或起来最大的连续数字段为 (7,8) 值为 7 ^ 8 = 15

Input
输入数据第一行是一个整数 T, 接下来有 T个例子

每个例子第一行是一个整数 n, 接下来是n个小于等于1000的非负整数 ( 1 <= n <= 100)

Output
对于每个例子输出 异或起来的值最大的 那个连续的数字段 异或起来的值

Sample Input
3
1
1
2
2 3
5
1 2 5 7 8
Sample Output
1
3
15

解题思路

首先,请相信计算机的性能
最多100个数,完全可以暴力解决。
把所有的情况列出来,选出最大的即可。

代码

#include<iostream>using namespace std;int main(){    int t;    cin>>t;    while(t--)    {        int n;        cin>>n;        int a[1001],max=0;        for(int i=0;i<n;i++)cin>>a[i];        for(int i=1;i<=n;i++)        {            for(int j=0;j+i<=n;j++)            {                int p;                for(int k=j,kk=0;kk<i;k++,kk++)                {                    if(kk==0)p=a[k];                    else p^=a[k];                }                if(max<p)max=p;            }        }        cout<<max<<endl;    }}
0 0
原创粉丝点击