PREFINVS - editorial

PROBLEM LINK

Practice
Contest

CONTEST PANEL

Author: Ildar Gainullin
Tester: Oleksandr Kulkov
Editorialist: Prateek Gupta

DIFFICULTY

EASY

PROBLEM

Given a binary string, you need to transform this into a string consisting of only zeros by applying a specific operation number of times. The operation allows you to choose a prefix of the string and flip all the bits i.e ‘0’ to ‘1’ and ‘1’ to ‘0’.

EXPLANATION

The key is to observe that we need to reverse iterate the string and maintain the state as to how many times we have applied the given operation. When you reverse iterate the string and apply the operation on some index, it will affect the whole prefix S[0..\ index\ -\ 1]. Having said that, when we arrive at a particular index in the string, we already know the number of operations that have been applied till now. Based on the digit at this index and number of operations applied, we decide what is the actual digit at this position. If it is ‘0’, we move forward, else we again flip the bits for a prefix ending at this position. Below is the simple pseudo code which will help you to understand things much better.


   operations = 0
   for ( i = s.length() - 1 to i = 0 ) {
       if ( digit(i) ^ operations ) {
           operations ^= 1;
       }
   }

It must be clear from the above snippet, that in case the number of operations are even, the state of the current bit will remain same, otherwise (bit ^ 1). Since, we are traversing a string once, the overall complexity will be O(N) where N is the length of the given string. For details on the implementation, have a look at the author or tester’s solution.

SOLUTIONS

Author solution can be found here.
Tester solution can be found here.

4 Likes

Please update solution links.

I am not able to understand it!! Can anyone describe it??
P.S: I passed all test cases of task #1 and got TLE in task #2!

@dishant_18 check out my solution very easy approach
solution link

see my solution in c++
https://www.codechef.com/viewsolution/13967949

Check this solution… easily understandable… CodeChef: Practical coding for everyone

nice solution @anurag_6767 and @osama_binladen
editorials could have been more easy

1 Like

i diid the same thing but why an infinite loop running

import java.util.;
import java.lang.
;
import java.io.*;

class cd119
{

public static void main(String args[])
{ //Integer.toBinaryString(124)
try{
int i,j;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

	int count = 0;

	String input = br.readLine();	
	
	int dec_rep = Integer.parseInt(input,2);
		
	while(dec_rep!=0)
	{
		int r = input.lastIndexOf('1');
		
		dec_rep = toggleBitsFromLToR(dec_rep,0,r);
		
		input = Integer.toBinaryString(dec_rep);
		
		count++;
		
		System.out.println(count);			
	}
	
	System.out.println(count);


	}catch(Exception e)
	{
		e.printStackTrace();
	} 

}

static int toggleBitsFromLToR(int n, int l, int r) 
{ 

    int num = ((1 << r) - 1) ^ ((1 << (l - 1)) - 1); 

    return (n ^ num); 
} 

}