SubXor
Given below c code for subxor spoj
Here I am posting iterative and recursive method to implement Tries.But if you want to understand the problem then follow recursive method.
Here question is based on concept of xor and I have implemented it through Trie .
Here question is based on concept of xor and I have implemented it through Trie .
Basic idea is :-
xor(i,j) means XOR of elements from indexed i to j of an Array
XOR(i,j) = XOR(1,i-1)^XOR(1,j);
This can be proved as
A^A = 0 & A^0 = A;
Hence if we XOR the total XOR from 1 to j with total XOR from 1 to i-1 ,it will nullify the effect of XOR(1,i-1) in XOR(1,j) and the remaining XOR will be XOR(i,j);
If you want to study about Tries then CLICK HERE
If you still have problem you can ask me @ raj.nishant360@gmail.com
Iterative Method to implement add and query function
#include <bits/stdc++.h>
using namespace std;
class Node
{
public:
int lCount,rCount;
Node *lChild,*rChild;
Node()
{
lCount=rCount=0;
lChild=rChild=NULL;
}
};
void addBit(Node *root,int n)
{
for(int i=20;i>=0;i--)
{
int x= (n>>i) & 1;
if(x)
{
root->rCount++;
if(root->rChild == NULL)
root->rChild = new Node();
root = root->rChild;
}
else
{
root->lCount++;
if(root->lChild == NULL)
root->lChild = new Node();
root = root->lChild;
}
}
}
int query(Node *root,int n,int k)
{
if(root == NULL)
return 0;
int res = 0;
for(int i=20;i>=0;i--)
{
bool ch1=(k>>i) & 1;
bool ch2=(n>>i) & 1;
if(ch1)
{
if(ch2){
res+=root->rCount;
if(root->lChild == NULL)
return res;
root = root->lChild;
}
else{
res+=root->lCount;
if(root->rChild == NULL)
return res;
root = root->rChild;
}
}
else
{
if(ch2){
if(root->rChild == NULL)
return res;
root= root->rChild;
}
else{
if(root->lChild == NULL)
return res;
root= root->lChild;
}
}
}
return res;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,k;
scanf("%d%d",&n,&k);
int temp,temp1,temp2=0;
Node *root = new Node();
addBit(root,0);
long long total =0;
for(int i=0;i<n;i++)
{
scanf("%d",&temp);
temp1= temp2^temp;
total+=(long long)query(root,temp1,k);
addBit(root , temp1);
temp2 = temp1;
}
printf("%lld\n",total);
}
return 0;
}
wrong solution.
ReplyDelete