Open In App

Counting even decimal value substrings in a binary string

Improve
Improve
Like Article
Like
Save
Share
Report

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 :

Recommended Practice

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

Below is the implementation of above idea.

C++




// 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;
}


Java




// 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.


Python3




# 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.


C#




// 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.


PHP




<?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.
?>


Javascript




<script>
 
// javascript 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
    var result = 0;
 
    // Pick starting point
    for (var i = 0; i < n; i++) {
 
        // Pick ending point
        for (var j = i; j < n; j++) {
 
            var decimalValue = 0;
            var powerOf2 = 1;
 
            // substring between current starting
            // and ending points
            for (var 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
var str = "10010";
var n = 5;
document.write( evenDecimalValue(str, n) );
 
// This code is contributed by rrrtnx.
</script>


Output

8

Time Complexity: O(n3).
Auxiliary Space: O(1)

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++




// 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;
}


Java




// 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.


Python3




# 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.


C#




// 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.


PHP




<?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.
?>


Javascript




<script>
    // Javascript 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
        let result = 0;
        for (let 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;
    }
     
    let str = "10010";
    let n = 5;
    document.write(evenDecimalValue(str, n));
     
    // This code is contributed by divyeshrabadiya07.
</script>


Output

8

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



Last Updated : 16 Oct, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads