ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Acwing 第 64 场周赛 C 4507. 子数组异或和(异或+前缀和)

2022-08-14 11:03:39  阅读:162  来源: 互联网

标签:周赛 输出 int LL 样例 4507 异或 数组


https://www.acwing.com/problem/content/4510/

给定一个长度为 n 的整数数组 a1,a2,…,an。

请你统计一共有多少个数组 a 的非空连续子数组能够同时满足以下所有条件:

该连续子数组的长度为偶数。
该连续子数组的前一半元素的异或和等于其后一半元素的异或和。

输出
一个整数,表示满足条件的连续子数组的数量。
输入样例1:
5
1 2 3 4 5
输出样例1:
1

输入样例2:
6
3 2 2 3 7 6
输出样例2:
3

输入样例3:
3
42 4 2
输出样例3:
0
  • s[r]^s[mid] = s[mid] ^ s[l-1]

  • s[r]=s[l-1]

  • 所以就是看对每个r有多少个l,然后区间长度为偶数,所以l-1和r奇偶性要相同

  • 直接map统计一下

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=400200,M=2002;
LL a[N],s[N];
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    LL n;
    cin>>n;
    for(LL i=1;i<=n;i++)
    {
        cin>>a[i];
        if(i==1) s[i]=a[i];
        else s[i]=s[i-1]^a[i];
        //cout<<s[i]<<" "; 
    }
    //cout<<endl;
    LL sum=0;
    map<LL,LL> odd,even;
    even[0]=1;//默认可以异或为0的时候就有一个了
    for(LL r=1;r<=n;r++)
    {
        if(r%2==1) sum+=odd[s[r]],odd[s[r]]++;//奇数
        else sum+=even[s[r]],even[s[r]]++;
        //cout<<sum<<" ";
    }
    //cout<<endl;
    cout<<sum<<endl;
    return 0;
}

标签:周赛,输出,int,LL,样例,4507,异或,数组
来源: https://www.cnblogs.com/Vivian-0918/p/16584968.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有