MarsOJ#MNS.315异或

异或(xor)

【题目描述】

给定一个仅包含 00 或 11 的序列 AA,求这个序列有多少个区间满足区间异或和为 11。

【输入格式】

从文件xor.in中读取数据

第一行一个整数 nn,表示序列 aa 长度。

接下来一行输入序列 aa。

【输出格式】

输出到文件xor.out

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

【输入样例】

4
1011

 

【输出样例】

6

 

【数据范围与约定】

  • 对于测试点 1∼21∼2:1≤n≤2001≤n≤200。
  • 对于测试点 3∼53∼5:1≤n≤1031≤n≤103。
  • 对于所有数据:1≤n≤1061≤n≤106。

【样例解释】

区间 [1,1][1,1],[3,3][3,3],[4,4][4,4],[1,2][1,2],[2,3][2,3],[1,4][1,4] 的异或和为 11。

AC代码:

#include <bits/stdc++.h>
#define ll long long
#define g(a,b) __gcd(a,b)
#define F1(a,n,b) for(int a = 1;a <= n;a += b)
#define F2(a,b,n,c) for(int a = b;a <= n;a += c)
#define l2(a) log(a) / log(2)
#define pll pair<ll,ll>
#define ull unsigned long long
#define pii pair<int,int>
#define pq1 priority_queue<int>
#define pq2 priority_queue<int,vector<int>,greater<int>>
#define ui unsigned int
using namespace std;
const int N = 1e6 + 10;
int n;
string a;
signed main() {
	scanf("%d",&n);
	cin>>a;
	ll ans = 0;
	int s[2] = {1,0},val = 0;
	for(int i = 1; i <= n; ++i) {
		val = val ^ (a[i - 1] - '0');
		ans += s[val ^ 1];
		s[val]++;
	}
	printf("%lld",ans);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值