a b 相等等价于 a^b=0.
则问题转换为找一对i,j a[i]^...^a[j]=0.
class Solution { public: int countTriplets(vector<int>& arr) { int n=arr.size(); vector<int> pre(n+1); for(int i=1;i<=n;i++){ pre[i]=pre[i-1]^arr[i-1]; } int res=0; for(int i=0;i<=n;i++){ for(int j=i+2;j<=n;j++){ if(pre[i]==pre[j]){ //a==b equals a^b==0 //pre[i]=a0^a1^...^a[i-1], pre[j]=a0^a1^...^a[j-1], if(pre[i]==pre[j]), then a[i]^a[i+1]^...^a[j-1]=0 //the middle index can be taken from[i+1,j-1], cnt=j-i-1 res+=j-i-1; } } } return res; } };
那么问题转换为找到两个pre相等。假设在i处pre[i]=t, 在i之前有pre[i1]=t, pre[i2]=t, pre[i3]=t, 则总个数为 i-i1-1 + i-i2-1 + i-i3-1= n*i-n-(i1+i2+i3)=n(i-1)-(i1+i2+i3).故可以记录pre出现的次数及index之和。
class Solution { public: int countTriplets(vector<int>& arr) { int n=arr.size(); vector<int> pre(n+1); for(int i=1;i<=n;i++){ pre[i]=pre[i-1]^arr[i-1]; } int res=0; unordered_map<int,int> cnt; unordered_map<int,int> sumofIndex; for(int i=0;i<=n;i++){ res+=cnt[pre[i]]*(i-1)-sumofIndex[pre[i]]; cnt[pre[i]]++; sumofIndex[pre[i]]+=i; } return res; } };