#include <bits/stdc++.h>
using namespace std;
#define endl "\n"
#define debug cout<<"debug"<<endl
mt19937 rd(time(0));
typedef long long ll;
typedef long double ld;
typedef pair<int, int> PII;
const double eps = 1e-8;
const double PI = 3.14159265358979323;
const int N = 1e6+10, M = 2*N, mod = 1e9+7;
const int INF = 0x3f3f3f3f;
int n;
void solve()
{
int n; cin>>n;
vector<int> a(n), cnt(2*n);
for(int i = 0; i<n; i++) cin>>a[i];
ll res = 1ll*n*(n+1)/2;
int pre = 0;
cnt[0]++;
// s[l~r] = s[r]^s[l-1]
// s[i] = pre^=a[i], s[i]^(j*j) = s[x] --> s[i]^s[x] = j*j = s[x+1 ~ r], x为某个前缀x个的异或和
// 记录所有前缀异或和的值, 再用当前的异或和 去找前缀异或和 即可遍历所有的区间的异或和
for(int i = 0; i<n; i++)
{
pre ^= a[i];
for(ll j = 0; j*j<2*n; j++)
{
ll x = pre^(j*j);
if(x < 2*n) res -= cnt[x];
}
cnt[pre] ++;
}
cout<<res<<endl;
}
int main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int T;
T = 1;
cin>>T;
while(T -- )
{
solve();
}
return 0;
}
CF1731 C. Even Subarrays(思维+前缀异或和)
最新推荐文章于 2024-11-12 15:18:48 发布