异或(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);
}