![]() |
VOOZH | about |
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 : 5
{"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:
5
Complexity : O(n + 2^10 * 2^10)