nowcoder Wannafly挑战赛1 B 【暴力 + 思维】

传送门
//思路: 由于n只有1000, 所以n^2的算法是可以通过的, 所以我们利用前缀和来求区间异或值, 然后枚举每一个位置, 算出该位置前面有多少种异或的可能值并计数, 然后算该位置之后的异或值, 加上对应前面的数量即可

AC Code

const int maxn = 1e3+5;
int a[maxn],s[maxn];
int vis[maxn*maxn];
void solve()
{
    int n;
    while(~scanf("%d",&n)){
        Fill(vis,0);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            s[i] = s[i-1] ^ a[i];
        }
        ll res = 0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=i;j++){
                vis[s[i] ^ s[j-1]]++;
            }
            for(int j=i+1;j<=n;j++){
                res += vis[s[j] ^ s[i]];
            }
        }
        cout << res << endl;
    }
}

你可能感兴趣的:(暴力/分块/枚举技巧,前缀和,想法思维题)