Color Sequence 异或前缀和 江西省赛2020

Color Sequence

https://ac.nowcoder.com/acm/contest/8827/E

题意

给定一个颜色序列,求它有多少个颜色出现次数都是偶数的连续子序列。

思路

出现次数为偶数容易联想到异或的性质:异或前缀和。

  1. 由于c很小,所以可以用int作为一个01串来存储颜色是否出现过,同时也可以利用异或
  2. 通过前缀和来存储len从1到n的01串的状态
  3. 然后对于每个前缀和,找有多少个同值前缀(桶实现)。通过异或同值,也即切掉前缀,即可得到一个异或值为0,出现次数为偶数的子串。

solution

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define sc(x) scanf("%lld", &(x))
ll a[1000005], n;
int sum[1000007];
unordered_map<int, ll> cnt;
signed main() {
    sc(n);
    for (int i = 1; i <= n; ++i) sc(a[i]);
    for (int i = 1; i <= n; ++i) sum[i] = sum[i - 1] ^ (1 << a[i]);
    ll ans = 0;
    cnt[0] = 1;
    for (int i = 1; i <= n; ++i) ans += cnt[sum[i]], ++cnt[sum[i]];
    printf("%lld\n", ans);
}
算法竞赛之路 文章被收录于专栏

整理、记录算法竞赛的好题

全部评论

相关推荐

09-16 14:01
井冈山大学 Java
肖先生~:兄弟们,我发的她都点赞了,但是就是不给我微信
秋招被确诊为……
点赞 评论 收藏
分享
评论
9
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务