Counting even decimal value substrings in a binary string

Given a binary string of size N. Count all substring that have even decimal value considering binary to decimal conversion from left to right (For example a substring “1011” is treated as 13)

Examples :

Input :  101
Output : 2
Explanation : 
Substring are   : 1, 10, 101, 0, 01, 1 
In decimal form : 1,  1,  3, 0,  2, 1 
There are only 2 even decimal value substring.  
  
Input : 10010
Output : 8 

Simple Solution is to one-by-one generate all sub-string and compute their decimal values. At lest, return count of even decimal value substring.

Below is the implementation of above idea.

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ code to generate all possible substring
// and count even decimal value substring.
#include <bits/stdc++.h>
using namespace std;
  
// generate all substring in arr[0..n-1]
int evenDecimalValue(string str, int n)
{
    // store the count
    int result = 0;
  
    // Pick starting point
    for (int i = 0; i < n; i++) {
  
        // Pick ending point
        for (int j = i; j < n; j++) {
  
            int decimalValue = 0;
            int powerOf2 = 1;
  
            // substring between current starting
            // and ending points
            for (int k = i; k <= j; k++) {
                decimalValue += ((str[k] - '0') * powerOf2);
  
                // increment power of 2 by one
                powerOf2 *= 2;
            }
  
            if (decimalValue % 2 == 0)
                result++;
        }
    }
    return result;
}
  
// Driver program
int main()
{
    string str = "10010";
    int n = 5;
    cout << evenDecimalValue(str, n) << endl;
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java Program to count all even
// decimal value substring .
import java.io.*;
  
class GFG 
{
    // generate all substring in arr[0..n-1]
    static int evenDecimalValue(String str, int n)
    {
       // store the count
       int result = 0;
  
       // Pick starting point
       for (int i = 0; i < n; i++) 
       {
  
          // Pick ending point
          for (int j = i; j < n; j++) 
          {
  
            int decimalValue = 0;
            int powerOf2 = 1;
  
            // substring between current 
            // starting and ending points
            for (int k = i; k <= j; k++) 
            {
                decimalValue += ((str.charAt(k) - 
                                 '0') * powerOf2);
  
                // increment power of 2 by one
                powerOf2 *= 2;
            }
  
            if (decimalValue % 2 == 0)
                result++;
          }
      }
      return result;
    }
  
    // Driver code
    public static void main (String[] args) 
    {
       String str = "10010";
       int n = 5;
       System.out.println(evenDecimalValue(str, n));
      
    }
}
  
//This code is contributed by Gitanjali.

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 Program to count all even
# decimal value substring
import math
  
# Generate all substring in arr[0..n-1]
def evenDecimalValue(str, n) :
      
    # Store the count
    result = 0
  
    # Pick starting point
    for i in range(0, n) :
  
        # Pick ending point
        for j in range(i, n):
  
            decimalValue = 0;
            powerOf2 = 1;
  
            # Substring between current 
            # starting and ending points
            for k in range(i, j + 1) :
                decimalValue += ((int(str[k])- 0) * powerOf2)
  
                # increment power of 2 by one
                powerOf2 *= 2
              
  
            if (decimalValue % 2 == 0):
                result += 1
          
    return result
  
  
# Driver code
str = "10010"
n = 5
print (evenDecimalValue(str, n))
      
# This code is contributed by Gitanjali.

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# Program to count all even
// decimal value substring .
using System;
  
class GFG 
{
    // generate all substring in arr[0..n-1]
    static int evenDecimalValue(string str, int n)
    {
        // store the count
        int result = 0;
      
        // Pick starting point
        for (int i = 0; i < n; i++) 
        {
      
            // Pick ending point
            for (int j = i; j < n; j++) 
            {
      
                int decimalValue = 0;
                int powerOf2 = 1;
      
                // substring between current 
                // starting and ending points
                for (int k = i; k <= j; k++) 
                {
                    decimalValue += ((str[k] - 
                                    '0') * powerOf2);
      
                    // increment power of 2 by one
                    powerOf2 *= 2;
                }
      
                if (decimalValue % 2 == 0)
                    result++;
            }
        }
        return result;
    }
  
    // Driver code
    public static void Main () 
    {
        String str = "10010";
        int n = 5;
        Console.WriteLine(evenDecimalValue(str, n));
          
    }
}
  
// This code is contributed by vt_m.

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP code to generate all 
// possible substring and 
// count even decimal value 
// substring
  
// generate all substring
// in arr[0..n-1]
function evenDecimalValue( $str, $n)
{
    // store the count
    $result = 0;
  
    // Pick starting point
    for ( $i = 0; $i < $n; $i++) 
    {
  
        // Pick ending point
        for ($j = $i; $j < $n; $j++) 
        {
  
            $decimalValue = 0;
            $powerOf2 = 1;
  
            // substring between current 
            // starting and ending points
            for ( $k = $i; $k <= $j; $k++) 
            {
                $decimalValue += (($str[$k] - '0') * 
                                   $powerOf2);
  
                // increment power of 2 by one
                $powerOf2 *= 2;
            }
  
            if ($decimalValue % 2 == 0)
                $result++;
        }
    }
    return $result;
}
  
// Driver Code
$str = "10010";
$n = 5;
echo evenDecimalValue($str, $n);
  
// This code is contributed by anuj_67.
?>

chevron_right



Output :

8

Time Complexity : O(n3)

Efficient solution is based on the fact that substring whose starting value is ‘0’ always produce even decimal value. so we simply traverse a loop from left to right and count all substring whose starting value is zero.

Below is the implementation of above idea.

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// Program to count all even decimal value substring .
#include <bits/stdc++.h>
using namespace std;
  
// function return count of even decimal
// value substring
int evenDecimalValue(string str, int n)
{
    // store the count of even decimal value substring
    int result = 0;
    for (int i = 0; i < n; i++) {
  
        // substring started with '0'
        if (str[i] == '0') {
  
            // increment result by (n-i)
            // because all substring which are generate by
            // this character produce even decimal value.
            result += (n - i);
        }
    }
    return result;
}
  
// Driver program
int main()
{
    string str = "10010";
    int n = 5;
    cout << evenDecimalValue(str, n) << endl;
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java Program to count all even
// decimal value substring .
import java.io.*;
  
class GFG 
{
    // function return count of 
    // even decimal value substring
    static int evenDecimalValue(String str, int n)
    {
        // store the count of even
        // decimal value substring
        int result = 0;
        for (int i = 0; i < n; i++) 
        {
  
            // substring started with '0'
            if (str.charAt(i) == '0'
            {
  
                // increment result by (n-i)
                // because all substring which 
                // are generate by this character 
                // produce even decimal value.
                result += (n - i);
            }
        }
        return result;
    }
  
    // Driver code
    public static void main(String[] args)
    {
        String str = "10010";
        int n = 5;
        System.out.println(evenDecimalValue(str, n));
    }
}
// This code is contributed 
// by Gitanjali.

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python Program to count all even
# decimal value substring
  
# Function return count of even 
# decimal value substring
def evenDecimalValue(str, n) :
  
    # Store the count of even
    # decimal value substring
    result = 0
    for i in range(0, n):
  
        # substring started with '0'
        if (str[i] == '0'):
  
            # increment result by (n-i)
            # because all substring which are generate by
            # this character produce even decimal value.
            result += (n - i)
      
    return result
  
# Driver code
str = "10010"
n = 5
print (evenDecimalValue(str, n))
  
# This code is contributed by Gitanjali.

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# Program to count all even
// decimal value substring .
using System;
  
class GFG 
{
    // function return count of 
    // even decimal value substring
    static int evenDecimalValue(string str, int n)
    {
        // store the count of even
        // decimal value substring
        int result = 0;
        for (int i = 0; i < n; i++) 
        {
  
            // substring started with '0'
            if (str[i] == '0'
            {
  
                // increment result by (n-i)
                // because all substring which 
                // are generate by this character 
                // produce even decimal value.
                result += (n - i);
            }
        }
        return result;
    }
  
    // Driver code
    public static void Main()
    {
        string str = "10010";
        int n = 5;
        Console.WriteLine(evenDecimalValue(str, n));
    }
}
// This code is contributed 
// by vt_m.

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP Program to count all
// even decimal value substring .
  
// function return count of 
// even decimal value substring
function evenDecimalValue($str, $n)
{
    // store the count of even 
    // decimal value substring
    $result = 0;
    for ($i = 0; $i < $n; $i++) 
    {
  
        // substring started with '0'
        if ($str[$i] == '0'
        {
  
            // increment result by (n-i)
            // because all substring which 
            // are generated by this character
            // produce even decimal value.
            $result += ($n - $i);
        }
    }
    return $result;
}
  
// Driver Code
$str = "10010";
$n = 5;
echo evenDecimalValue($str, $n) ;
return 0;
  
// This code is contributed by SanjuTomar.
?>

chevron_right


]
Output :

8

Time Complexity : O(n)
Space complexity :O(1)



My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : SanjuTomar, vt_m



Article Tags :
Practice Tags :


Be the First to upvote.


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.