列表

详情


NC212840. xor

描述

小明现在有一个长度为的数组,其元素分别为
小明现在想将a拆分成若干个连续的子数组,并满足拆分后的每个数组的异或和为
现在小明想知道,在给定数组的情况下,有多少种不同的拆分方案使其满足小明的要求?
由于答案可能很大,请将结果对取余数。
一个数组的异或和可以表示为,其中表示二进制异或。
注解:
异或(xor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。其运算法则为:
a⊕b = (¬a ∧ b) ∨ (a ∧¬b)
异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位,所以异或常被认作不进位加法。

输入描述

第一行输入两个整数,表示题目描述中的
接下来一行输入个整数,表述数组

输出描述

每组数据输出一个整数,表示方案数对取余数的结果

示例1

输入:

3 1
1 1 1

输出:

2

说明:

两种拆分方式分别为
[1,1,1]
[1][1][1]
其中,[1][1,1] [1,1][1]的拆分方式不符合题意 因为sum([1,1])=0

原站题解

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

C++(clang++ 11.0.1) 解法, 执行用时: 103ms, 内存消耗: 9764K, 提交时间: 2022-10-19 17:00:24

#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9+7;
int n,x;
int main()
{
	map<int,int>mp;
	cin>>n>>x;
	int now=0;
	int result=0;
	int t;
	mp[0]=1;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&t);
		now^=t;
		result=mp[now^x];
		mp[now]=(mp[now]+result)%mod;
	}
	cout<<result;
	
}

Python3(3.9) 解法, 执行用时: 153ms, 内存消耗: 28908K, 提交时间: 2020-10-29 19:44:42

n, x = map(int, input().split())
plans = {0:1}
nums = list(map(int, input().split()))

xor = 0
result = 0
for num in nums:
    xor ^= num
    result = plans.setdefault(xor^ x, 0)
    plans[xor] = (plans.setdefault(xor,0) + result) % int(1e9 + 7)

print("{}".format(result))

上一题