VOOZH about

URL: https://www.geeksforgeeks.org/dsa/pairs-whose-concatenation-contain-digits/

⇱ Pairs whose concatenation contain all digits - GeeksforGeeks


  • Courses
  • Tutorials
  • Interview Prep

Pairs whose concatenation contain all digits

Last Updated : 16 Dec, 2022

Given an array of n numbers. The task is to find the number of pairs that can be taken from the given which on concatenation will contain all the digits from 0 to 9.

Examples: 

Input : num[][] = { "129300455", "5559948277", "012334556", "56789", "123456879" } 
Output :
{"129300455", "56789"}, { "129300455", "123456879"}, {"5559948277", "012334556"}, 
{"012334556", "56789"}, {"012334556", "123456879"} are the pair which contain all the digits from 0 to 9 on concatenation.

Note: The number of the digit in each of the numbers can be 10^6.

The idea is to represent each number as the mask of 10 bits such that if it contains digit i at least once then ith bit will be set in the mask. 
For example, 
let n = 4556120 then 0th, 1st, 2nd, 4th, 5th, 6th bits will be set in the mask. 
Thus, mask = (0001110111)2 = (119)10 
Now, for every mask m from 0 to 2^10 - 1, we will store the count of the number of numbers having the mask of their number equals to m
So, we will make an array, say cnt[], where cnt[i] stores the count of the number of numbers whose mask is equal to i. Pseudocode for this: 

for (i = 0; i < (1 << 10); i++)
 cnt[i] = 0;

for (i = 1; i <= n; i++)
{
 string x = p[i];
 int mask = 0;
 for (j = 0; j < x.size(); j++) 
 mask |= (1 << (x[j] - '0';);
 
 
 cnt[mask]++;
}

A pair of numbers will have all the digit from 0 to 9 if every bit from 0 to 9 is set in the bitwise OR of maskof both the number, i.e if it's equal to (1111111111)2</sub) = (1023)10

Now, we will iterate over all pairs of masks whose bitwise OR is equal to 1023 and add a number of ways.

Below is the implementation of this approach:  


Output
5

Complexity : O(n + 2^10 * 2^10)

Comment
Article Tags: