牛客寒假4 d 字段异或

在这里插入图片描述
这道题是利用前缀和来求解的,sum从头开始不断^表示现在的状态,原理是如果sum[l-1]=sum[r]就说明l到r的子段异或和为0,那么我们用一个map存储某一个输出所出现个数,因为每一次出现这个数都会产生这个数出现次数的新子集(只有首尾相等就说明这段可行·)至于为什么一定要用map是因为数组可能出现的范围过大,直接用数组存会爆栈‘代码很简短

# include <bits/stdc++.h>
using namespace std;
map <long long int,int> m;
int main()
{
    long long n,sum=0,ans=0;
    cin>>n;
    m[0]=1;
    for(int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        sum^=x;
        ans+=m[sum]++;
    }
    cout<<ans;
    return 0;
}
发布了48 篇原创文章 · 获赞 17 · 访问量 4468

猜你喜欢

转载自blog.csdn.net/weixin_45757507/article/details/104272490
今日推荐