列表

详情


NC14247. Xorto

描述

给定一个长度为n的整数数组,问有多少对互不重叠的非空区间,使得两个区间内的数的异或和为0。

输入描述

第一行一个数n表示数组长度;
第二行n个整数表示数组;
1<=n<=1000,0<=数组元素<100000。

输出描述

一行一个整数表示答案。

示例1

输入:

3
0 0 0

输出:

5

说明:

([1,1],[2,2]),([1,1],[3,3]),([1,1],[2,3]),([1,2],[3,3]),([2,2],[3,3])

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 6ms, 内存消耗: 1120K, 提交时间: 2020-05-22 01:14:19

#include <bits/stdc++.h>
using namespace std;
int a[10005],mp[3000005];
int main(){
	int n,x;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>x;
		a[i]=a[i-1]^x;
	}
	
	long long sum = 0;
	for(int i=1;i<=n;i++){
		for(int j=i;j>=1;j--){
			mp[a[i]^a[j-1]]++;
		}
		for(int j=i;j<n;j++){
			sum+=mp[a[i]^a[j+1]];
		}
	}
	cout<<sum<<endl;
}

C++(clang++ 11.0.1) 解法, 执行用时: 7ms, 内存消耗: 1564K, 提交时间: 2023-05-31 22:59:16

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,i,j,a[10010],f[500010],ans;
int main(){
	scanf("%lld",&n);
	for(i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		a[i]^=a[i-1];
	}
	for(i=1;i<=n;i++){
		for(j=i;j<=n;j++)ans+=f[a[j]^a[i-1]];
		for(j=0;j<i;j++)f[a[i]^a[j]]++;
	}
	printf("%lld",ans);
}

上一题