This code is for handling addition of two binary numbers, which can be as long as 100,000 bits... and up to 500,000 queries are performed.
High-level pseudocode:
- First input
N: number of bits in binary numberAandB. - Second input
Q: number of queries to be performed. - Next
Ninputs: 0/1s ... bits forA - Next
Ninputs: 0/1s ... bits forB Next
Qinputs are one of the following:set_a INDEX VALUE: as a result I seta[INDEX] = VALUEset_b INDEX VALUE: as a result I setb[INDEX] = VALUEget_c INDEX: as a result I printc[INDEX]whereC = A+B(binary addition, like100 + 101 = 1001)
#include <iostream>
#include <string>
#include <set>
#include <algorithm>
#include <utility> // For pair
#include <iterator> // For iterator, bidirectional_iterator_tag, reverse_iterator
#include <climits> // For CHAR_BIT, ULONG_MAX
using namespace std;
class VanEmdeBoasTree {};
int main(int argc, char * argv[])
{
int n, q;
char c;
bool a[100005] = {0}, b[100005] = {0};
VanEmdeBoasTree equals;
cin>>n;
cin>>q;
for(int i=0;i<n;i++){
cin>>c;
if(c=='1')
a[n-i-1] = true;
}
for(int i=0;i<n;i++){
cin>>c;
if(c=='1')
b[n-i-1] = true;
if(a[n-i-1] == b[n-i-1]){
equals.insert(n-i-1);
}
}
string query;
int index, val, lastval;
for(int i=0;i<q;i++){
cin>>query;
cin>>index;
if(query[4] == 'a'){
cin>>val;
if(a[index] != val){
a[index] = val;
if(a[index] == b[index]){
equals.insert(index);
}else{
equals.erase(index);
}
}
}else if(query[4] == 'b'){
cin>>val;
if(b[index] != val){
b[index] = val;
if(a[index] == b[index]){
equals.insert(index);
}else{
equals.erase(index);
}
}
}else if(query[4] == 'c'){
int final = 0;
if(index == n){
if(equals.size() > 0){
VanEmdeBoasTree::const_iterator it = equals.predecessor(index+1);
if(it!=equals.end() && a[*it] == 1){
final = 1;
}
}
}else{
final = (a[index] + b[index])%2;
if(equals.size() > 0){
VanEmdeBoasTree::const_iterator it = equals.predecessor(index);
int last = -1;
if(it != equals.end())
last = *it;
if( last!=-1 && index!=0 && it!=equals.end() && a[last] == 1){
final = 1-final;
}
}
}
cout<<final;
}
}
return 0;
}
My solution is not fast enough as the Judge says "time out" after some test cases.