题目链接:https://ac.nowcoder.com/acm/contest/393/B
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld

题目描述

注意本题有模数
给定一个长度为 n 的序列{a},求:
max 1≤i≤j≤n{(ai⊕ai+1⊕⋯⊕aj)+(ai+ai+1+⋯+aj)}mod100000007
其中 ⊕ 表示异或

输入描述:

第一行一个整数 n 。
第二行 n 个整数,表示 ai。

输出描述:

一行一个整数 ans,表示答案。

输入

3
1 2 3

输出

6

说明

我们 显然需要将所有的数字都选上,此时 ans=(1⊕2⊕3)+1+2+3=6.

备注:

对于所有的数据,保证 1≤n≤3×10^5,0≤ai<2^20。
样例:想不到吧,你的做法至少能过样例!

解题思路

我们很容易知道a^b>=a-b,即a^b+b>=a。当我们遇到一个数b的时候,如果我们不选b的话,到最后就加上一个ans2,如果选的话,我们就会加上ans2^b+b,由上可知ans2^b+b>=ans2。说明ans2=ans2^b之后有可能会使ans2变小,但是ans1会多加上一个b,所以只要遇到一个数就要把它全加上。

#include <stdio.h>
int main() {
    int n, m;
    long long ans1, ans2;
    while (~scanf("%d", &n)) {
        ans1 = ans2 = 0;
        for (int i = 0; i < n; i++) {
            scanf("%d", &m);
            ans1 += 1ll * m;
            ans2 ^= 1ll * m;
        }
        printf("%lld\n", (ans1 + ans2) % 100000007);
    }
    return 0;
}