Count of cyclic permutations having XOR with other binary string as 0
Last Updated :
09 Sep, 2022
Given two binary strings and . Let be set of all the cyclic permutations of string . The task is to find how many strings in set when XORed with give as result.
Examples:
Input: A = “101”, B = “101”
Output: 1
S = {“101”, “011”, “110”}
Only “101” XOR “101” = 0
Input: A = “111”, B = “111”
Output: 3
Approach: Concatenate with so that it contains all of it’s cyclic permutations as sub-strings. Now the problem is reduced to find the number of occurrences of pattern in string which can be solved using Z algorithm (for linear time pattern searching).
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void compute_z(string s, int z[])
{
int l = 0, r = 0;
int n = s.length();
for ( int i = 1; i <= n - 1; i++) {
if (i > r) {
l = i, r = i;
while (r < n && s[r - l] == s[r])
r++;
z[i] = r - l;
r--;
}
else {
int k = i - l;
if (z[k] < r - i + 1) {
z[i] = z[k];
}
else {
l = i;
while (r < n && s[r - l] == s[r])
r++;
z[i] = r - l;
r--;
}
}
}
}
int countPermutation(string a, string b)
{
b = b + b;
b = b.substr(0, b.size() - 1);
int ans = 0;
string s = a + "$" + b;
int n = s.length();
int z[n];
compute_z(s, z);
for ( int i = 1; i <= n - 1; i++) {
if (z[i] == a.length())
ans++;
}
return ans;
}
int main()
{
string a = "101" ;
string b = "101" ;
cout << countPermutation(a, b) << endl;
return 0;
}
|
Java
public class GFG{
static void compute_z(String s, int z[])
{
int l = 0 , r = 0 ;
int n = s.length();
for ( int i = 1 ; i <= n - 1 ; i++) {
if (i > r) {
l = i;
r = i;
while (r < n && s.charAt(r - l) == s.charAt(r))
r++;
z[i] = r - l;
r--;
}
else {
int k = i - l;
if (z[k] < r - i + 1 ) {
z[i] = z[k];
}
else {
l = i;
while (r < n && s.charAt(r - l) == s.charAt(r))
r++;
z[i] = r - l;
r--;
}
}
}
}
static int countPermutation(String a, String b)
{
b = b + b;
b = b.substring( 0 , b.length() - 1 );
int ans = 0 ;
String s = a + "$" + b;
int n = s.length();
int z[] = new int [n];
compute_z(s, z);
for ( int i = 1 ; i <= n - 1 ; i++) {
if (z[i] == a.length())
ans++;
}
return ans;
}
public static void main(String []args){
String a = "101" ;
String b = "101" ;
System.out.println(countPermutation(a, b)) ;
}
}
|
Python3
def compute_z(s, z):
l = 0
r = 0
n = len (s)
for i in range ( 1 , n, 1 ):
if (i > r):
l = i
r = i
while (r < n and s[r - l] = = s[r]):
r + = 1
z[i] = r - l
r - = 1
else :
k = i - l
if (z[k] < r - i + 1 ):
z[i] = z[k]
else :
l = i
while (r < n and s[r - l] = = s[r]):
r + = 1
z[i] = r - l
r - = 1
def countPermutation(a, b):
b = b + b
b = b[ 0 : len (b) - 1 ]
ans = 0
s = a + "$" + b
n = len (s)
z = [ 0 for i in range (n)]
compute_z(s, z)
for i in range ( 1 , n, 1 ):
if (z[i] = = len (a)):
ans + = 1
return ans
if __name__ = = '__main__' :
a = "101"
b = "101"
print (countPermutation(a, b))
|
C#
using System;
class GFG
{
public static void compute_z( string s,
int [] z)
{
int l = 0, r = 0;
int n = s.Length;
for ( int i = 1; i <= n - 1; i++)
{
if (i > r)
{
l = i;
r = i;
while (r < n && s[r - l] == s[r])
{
r++;
}
z[i] = r - l;
r--;
}
else
{
int k = i - l;
if (z[k] < r - i + 1)
{
z[i] = z[k];
}
else
{
l = i;
while (r < n && s[r - l] == s[r])
{
r++;
}
z[i] = r - l;
r--;
}
}
}
}
public static int countPermutation( string a,
string b)
{
b = b + b;
b = b.Substring(0, b.Length - 1);
int ans = 0;
string s = a + "$" + b;
int n = s.Length;
int [] z = new int [n];
compute_z(s, z);
for ( int i = 1; i <= n - 1; i++)
{
if (z[i] == a.Length)
{
ans++;
}
}
return ans;
}
public static void Main( string [] args)
{
string a = "101" ;
string b = "101" ;
Console.WriteLine(countPermutation(a, b));
}
}
|
Javascript
<script>
function compute_z(s, z) {
var l = 0,
r = 0;
var n = s.length;
for ( var i = 1; i <= n - 1; i++) {
if (i > r) {
l = i;
r = i;
while (r < n && s[r - l] === s[r]) {
r++;
}
z[i] = r - l;
r--;
} else {
var k = i - l;
if (z[k] < r - i + 1) {
z[i] = z[k];
} else {
l = i;
while (r < n && s[r - l] === s[r]) {
r++;
}
z[i] = r - l;
r--;
}
}
}
}
function countPermutation(a, b) {
b = b + b;
b = b.substring(0, b.length - 1);
var ans = 0;
var s = a + "$" + b;
var n = s.length;
var z = new Array(n).fill(0);
compute_z(s, z);
for ( var i = 1; i <= n - 1; i++) {
if (z[i] === a.length) {
ans++;
}
}
return ans;
}
var a = "101" ;
var b = "101" ;
document.write(countPermutation(a, b));
</script>
|
Complexity Analysis:
- Time Complexity : O(|a+b|) ,where |a+b| is size of string(a+b).
- Space Complexity : O(|a+b|)
Share your thoughts in the comments
Please Login to comment...