【每日一題】Xorto (前綴和優(yōu)化枚舉)
Xorto
https://ac.nowcoder.com/acm/problem/14247
Solution
前綴和優(yōu)化,用維護
的區(qū)間異或和,那么
的區(qū)間異或和即
。
那么遍歷 i ,枚舉 i 作為右端點統(tǒng)計區(qū)間異或和,再枚舉 i+1 為左端點統(tǒng)計答案。
關(guān)鍵點在于左邊區(qū)間統(tǒng)計,右邊區(qū)間更新而不統(tǒng)計,保證區(qū)間不重疊。
Code
#include<bits/stdc++.h> #define mp make_pair #define pb push_back #define ll long long #define io std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) using namespace std; inline ll read(){ll s=0,w=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();return s*w;} void put1(){ puts("YES") ;}void put2(){ puts("NO") ;}void put3(){ puts("-1"); } ll qp(ll a,ll b, ll p){ll ans = 1;while(b){if(b&1){ans = (ans*a)%p;--b;}a = (a*a)%p;b >>= 1;}return ans%p;} const int mo=998244353; const int mod=1000000007; const int manx=1e5+5; ll a[manx]; map<ll,ll>cnt; int main(){ ll n=read(); for(int i=1;i<=n;i++){ ll x=read(); a[i]=a[i-1]^x; } ll ans=0; for(int i=1;i<=n;i++){ for(int j=1;j<=i;j++) cnt[a[i]^a[j-1]]++; for(int j=i+1;j<=n;j++) ans+=cnt[a[j]^a[i]]; // cnt.clear(); } cout<<ans; return 0; }