Рубрики

Количество циклических перестановок, имеющих XOR с другой двоичной строкой, равной 0

Учитывая две двоичные строки и , Позволять быть набор всех циклических перестановок строки , Задача состоит в том, чтобы найти, сколько строк в наборе когда XORed с дайте как результат.

Примеры:

Input: A = “101”, B = “101”
Output: 1
S = {“101”, “011”, “110”}
Only “101” XOR “101” = 0

Input: A = “111”, B = “111”
Output: 3

Подход: объединить с так что он содержит все свои циклические перестановки как подстроки. Теперь проблема сводится к тому, чтобы найти количество вхождений паттерна в строке которая может быть решена с использованием алгоритма Z (для поиска по линейному временному образцу).

Ниже приведена реализация вышеуказанного подхода:

C ++

// C ++ программа для поиска побитового XOR между двоичным
// строка A и все циклические перестановки
// двоичной строки B
#include <bits/stdc++.h>

using namespace std;

  
// Реализация Z-алгоритма
// для поиска по линейному времени

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

            }

        }

    }

}

  
// Функция для подсчета циклического
// перестановки b, которые дали 0, когда XORed с

int countPermutation(string a, string b)

{

    // объединяем b с b

    b = b + b;

  

    // новый b теперь содержит все циклические

    // перестановки старого b как его подстроки

    b = b.substr(0, b.size() - 1);

  

    // объединить шаблон с текстом

    int ans = 0;

    string s = a + "$" + b;

    int n = s.length();

  

    // Заполняем массив z, используемый в алгоритме Z

    int z[n];

    compute_z(s, z);

  

    for (int i = 1; i <= n - 1; i++) {

  

        // шаблон встречается по индексу i, так как

        // z значение 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-программа для поиска побитового XOR между двоичным
// строка A и все циклические перестановки
// двоичной строки B

  

public class GFG{

      

    // Реализация Z-алгоритма

    // для поиска по линейному времени

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

                }

            }

        }

    }

      

    // Функция для подсчета циклического

    // перестановки b, которые дали 0, когда XORed с

    static int countPermutation(String a, String b)

    {

        // объединяем b с b

        b = b + b;

        // новый b теперь содержит все циклические

        // перестановки старого b как его подстроки

        b = b.substring(0, b.length() - 1);

      

        // объединить шаблон с текстом

        int ans = 0;

        String s = a + "$" + b;

        int n = s.length();

      

        // Заполняем массив z, используемый в алгоритме Z

        int z[] = new int[n];

        compute_z(s, z);

      

        for (int i = 1; i <= n - 1; i++) {

      

            // шаблон встречается по индексу i, так как

            // z значение 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)) ;

     }

     // Этот код предоставлен ANKITRAI1

}

python3

# Python 3 программа для поиска побитового XOR
# между двоичной строкой A и всеми
# циклические перестановки двоичной строки B

  
# Реализация Z-алгоритма
# для поиска по линейному шаблону времени

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

      
# Функция для получения отсчета циклического
# перестановки b, которые дали 0, когда XORed с

def countPermutation(a, b):

      

    # объединить b с b

    b = b + b

  

    # new b теперь содержит все циклические

    # перестановки старого b как его подстроки

    b = b[0:len(b) - 1]

  

    # объединить шаблон с текстом

    ans = 0

    s = a + "$" + b

    n = len(s)

  

    # Заполнить массив z, используемый в алгоритме Z

    z = [0 for i in range(n)]

    compute_z(s, z)

  

    for i in range(1, n, 1):

          

        # шаблон встречается в индексе i, так как

        # z значение i равно длине шаблона

        if (z[i] == len(a)):

            ans += 1

      

    return ans

  
# Код драйвера

if __name__ == '__main__':

    a = "101"

    b = "101"

  

    print(countPermutation(a, b))

      
# Этот код предоставлен
# Surendra_Gangwar

C #

// C # программа для поиска побитового XOR между
// двоичная строка A и все циклические
// перестановки двоичной строки B

using System;

  

class GFG

{

  
// Реализация Z-алгоритма
// для поиска по линейному времени

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

            }

        }

    }

}

  
// Функция для получения количества
// циклические перестановки b,
// дано 0, когда XORed с

public static int countPermutation(string a, 

                                   string b)

{

    // объединяем b с b

    b = b + b;

      

    // новый b теперь содержит все циклические

    // перестановки старого b как его подстроки

    b = b.Substring(0, b.Length - 1);

  

    // объединить шаблон с текстом

    int ans = 0;

    string s = a + "$" + b;

    int n = s.Length;

  

    // Заполняем массив z, используемый в алгоритме Z

    int[] z = new int[n];

    compute_z(s, z);

  

    for (int i = 1; i <= n - 1; i++)

    {

  

        // шаблон встречается по индексу i, так как

        // z значение 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));

}
}

  
// Этот код предоставлен Shrikant13

Выход:

1

Рекомендуемые посты:

Количество циклических перестановок, имеющих XOR с другой двоичной строкой, равной 0

0.00 (0%) 0 votes