Zähle alle Paare mit gegebenem XOR
Gegeben sei ein Array unterschiedlicher positiver Ganzzahlen und eine Zahl x. Ermitteln Sie die Anzahl der Ganzzahlpaare im Array, deren XOR gleich x ist.
Beispiele:
Input : arr[] = {5 4 10 15 7 6} x = 5 Output : 1 Explanation : (10 ^ 15) = 5 Input : arr[] = {3 6 8 10 15 50} x = 5 Output : 2 Explanation : (3 ^ 6) = 5 and (10 ^ 15) = 5 A Einfache Lösung besteht darin, jedes Element zu durchlaufen und zu prüfen, ob es eine andere Zahl gibt, deren XOR-Verknüpfung damit gleich x ist. Diese Lösung benötigt O(n 2 ) Zeit. Ein effiziente Lösung Die Lösung dieses Problems dauert O(n) Zeit. Die Idee basiert auf der Tatsache, dass arr[i] ^ arr[j] genau dann gleich x ist, wenn arr[i] ^ x gleich arr[j] ist.
1) Initialize result as 0. 2) Create an empty hash set 's'. 3) Do following for each element arr[i] in arr[] (a) If x ^ arr[i] is in 's' then increment result by 1. (b) Insert arr[i] into the hash set 's'. 3) return result.
Durchführung:
C++ // C++ program to Count all pair with given XOR // value x #include using namespace std ; // Returns count of pairs in arr[0..n-1] with XOR // value equals to x. int xorPairCount ( int arr [] int n int x ) { int result = 0 ; // Initialize result // create empty set that stores the visiting // element of array. // Refer below post for details of unordered_set // https://www.geeksforgeeks.org/cpp/unordered_set-in-cpp-stl/ unordered_set < int > s ; for ( int i = 0 ; i < n ; i ++ ) { // If there exist an element in set s // with XOR equals to x^arr[i] that means // there exist an element such that the // XOR of element with arr[i] is equal to // x then increment count. if ( s . find ( x ^ arr [ i ]) != s . end ()) result ++ ; // Make element visited s . insert ( arr [ i ]); } // return total count of pairs with XOR equal to x return result ; } // driver program int main () { int arr [] = { 5 4 10 15 7 6 }; int n = sizeof ( arr ) / sizeof ( arr [ 0 ]); int x = 5 ; cout < < 'Count of pairs with given XOR = ' < < xorPairCount ( arr n x ); return 0 ; }
Java // Java program to Count all pair with // given XOR value x import java.util.* ; class GFG { // Returns count of pairs in arr[0..n-1] with XOR // value equals to x. static int xorPairCount ( int arr [] int n int x ) { int result = 0 ; // Initialize result // create empty set that stores the visiting // element of array. // Refer below post for details of unordered_set // https://www.geeksforgeeks.org/cpp/unordered_set-in-cpp-stl/ HashSet < Integer > s = new HashSet < Integer > (); for ( int i = 0 ; i < n ; i ++ ) { // If there exist an element in set s // with XOR equals to x^arr[i] that means // there exist an element such that the // XOR of element with arr[i] is equal to // x then increment count. if ( s . contains ( x ^ arr [ i ] ) && ( x ^ arr [ i ] ) == ( int ) s . toArray () [ s . size () - 1 ] ) { result ++ ; } // Make element visited s . add ( arr [ i ] ); } // return total count of // pairs with XOR equal to x return result ; } // Driver code public static void main ( String [] args ) { int arr [] = { 5 4 10 15 7 6 }; int n = arr . length ; int x = 5 ; System . out . print ( 'Count of pairs with given XOR = ' + xorPairCount ( arr n x )); } } // This code contributed by Rajput-Ji
Python3 # Python3 program to count all the pair # with given xor # Returns count of pairs in arr[0..n-1] # with XOR value equals to x. def xorPairCount ( arr n x ): result = 0 # Initialize result # create empty set that stores the # visiting element of array. s = set () for i in range ( 0 n ): # If there exist an element in set s # with XOR equals to x^arr[i] that # means there exist an element such # that the XOR of element with arr[i] # is equal to x then increment count. if ( x ^ arr [ i ] in s ): result = result + 1 # Make element visited s . add ( arr [ i ]) return result # Driver Code if __name__ == '__main__' : arr = [ 5 4 10 15 7 6 ] n = len ( arr ) x = 5 print ( 'Count of pair with given XOR = ' + str ( xorPairCount ( arr n x ))) # This code is contributed by Anubhav Natani
C# // C# program to Count all pair with // given XOR value x using System ; using System.Collections.Generic ; class GFG { // Returns count of pairs in arr[0..n-1] with XOR // value equals to x. static int xorPairCount ( int [] arr int n int x ) { int result = 0 ; // Initialize result // create empty set that stores the visiting // element of array. // Refer below post for details of unordered_set // https://www.geeksforgeeks.org/cpp/unordered_set-in-cpp-stl/ HashSet < int > s = new HashSet < int > (); for ( int i = 0 ; i < n ; i ++ ) { // If there exist an element in set s // with XOR equals to x^arr[i] that means // there exist an element such that the // XOR of element with arr[i] is equal to // x then increment count. if ( s . Contains ( x ^ arr [ i ])) { result ++ ; } // Make element visited s . Add ( arr [ i ]); } // return total count of // pairs with XOR equal to x return result ; } // Driver code public static void Main () { int [] arr = { 5 4 10 15 7 6 }; int n = arr . Length ; int x = 5 ; Console . WriteLine ( 'Count of pairs with given XOR = ' + xorPairCount ( arr n x )); } } /* This code contributed by PrinciRaj1992 */
JavaScript < script > // Javascript program to Count all pair with // given XOR value x // Returns count of pairs in arr[0..n-1] with XOR // value equals to x. function xorPairCount ( arr n x ) { let result = 0 ; // Initialize result // create empty set that stores the visiting // element of array. // Refer below post for details of unordered_set // https://www.geeksforgeeks.org/cpp/unordered_set-in-cpp-stl/ let s = new Set (); for ( let i = 0 ; i < n ; i ++ ) { // If there exist an element in set s // with XOR equals to x^arr[i] that means // there exist an element such that the // XOR of element with arr[i] is equal to // x then increment count. if ( s . has ( x ^ arr [ i ]) ) { result ++ ; } // Make element visited s . add ( arr [ i ]); } // return total count of // pairs with XOR equal to x return result ; } // Driver code let arr = [ 5 4 10 15 7 6 ]; let n = arr . length ; let x = 5 ; document . write ( 'Count of pairs with given XOR = ' + xorPairCount ( arr n x )); // This code is contributed by unknown2108 < /script>
Ausgabe
Count of pairs with given XOR = 1
Zeitkomplexität: An)
Hilfsraum: O(n)
Wie gehe ich mit Duplikaten um?
Die obige effiziente Lösung funktioniert nicht, wenn das Eingabearray Duplikate enthält. Beispielsweise liefert die obige Lösung unterschiedliche Ergebnisse für {2 2 5} und {5 2 2}. Um Duplikate zu verarbeiten, speichern wir die Anzahl der Vorkommen aller Elemente. Wir verwenden unordered_map anstelle von unordered_set.
Durchführung:
C++ // C++ program to Count all pair with given XOR // value x #include using namespace std ; // Returns count of pairs in arr[0..n-1] with XOR // value equals to x. int xorPairCount ( int arr [] int n int x ) { int result = 0 ; // Initialize result // create empty map that stores counts of // individual elements of array. unordered_map < int int > m ; for ( int i = 0 ; i < n ; i ++ ) { int curr_xor = x ^ arr [ i ]; // If there exist an element in map m // with XOR equals to x^arr[i] that means // there exist an element such that the // XOR of element with arr[i] is equal to // x then increment count. if ( m . find ( curr_xor ) != m . end ()) result += m [ curr_xor ]; // Increment count of current element m [ arr [ i ]] ++ ; } // return total count of pairs with XOR equal to x return result ; } // driver program int main () { int arr [] = { 2 5 2 }; int n = sizeof ( arr ) / sizeof ( arr [ 0 ]); int x = 0 ; cout < < 'Count of pairs with given XOR = ' < < xorPairCount ( arr n x ); return 0 ; }
Java // Java program to Count all pair with given XOR // value x import java.util.* ; class GFG { // Returns count of pairs in arr[0..n-1] with XOR // value equals to x. static int xorPairCount ( int arr [] int n int x ) { int result = 0 ; // Initialize result // create empty map that stores counts of // individual elements of array. Map < Integer Integer > m = new HashMap <> (); for ( int i = 0 ; i < n ; i ++ ) { int curr_xor = x ^ arr [ i ] ; // If there exist an element in map m // with XOR equals to x^arr[i] that means // there exist an element such that the // XOR of element with arr[i] is equal to // x then increment count. if ( m . containsKey ( curr_xor )) result += m . get ( curr_xor ); // Increment count of current element if ( m . containsKey ( arr [ i ] )) { m . put ( arr [ i ] m . get ( arr [ i ] ) + 1 ); } else { m . put ( arr [ i ] 1 ); } } // return total count of pairs with XOR equal to x return result ; } // Driver code public static void main ( String [] args ) { int arr [] = { 2 5 2 }; int n = arr . length ; int x = 0 ; System . out . println ( 'Count of pairs with given XOR = ' + xorPairCount ( arr n x )); } } // This code has been contributed by 29AjayKumar
Python3 # Python3 program to Count all pair with # given XOR value x # Returns count of pairs in arr[0..n-1] # with XOR value equals to x. def xorPairCount ( arr n x ): result = 0 # Initialize result # create empty map that stores counts # of individual elements of array. m = dict () for i in range ( n ): curr_xor = x ^ arr [ i ] # If there exist an element in map m # with XOR equals to x^arr[i] that # means there exist an element such that # the XOR of element with arr[i] is equal # to x then increment count. if ( curr_xor in m . keys ()): result += m [ curr_xor ] # Increment count of current element if arr [ i ] in m . keys (): m [ arr [ i ]] += 1 else : m [ arr [ i ]] = 1 # return total count of pairs # with XOR equal to x return result # Driver Code arr = [ 2 5 2 ] n = len ( arr ) x = 0 print ( 'Count of pairs with given XOR = ' xorPairCount ( arr n x )) # This code is contributed by Mohit Kumar
C# // C# program to Count all pair with given XOR // value x using System ; using System.Collections.Generic ; class GFG { // Returns count of pairs in arr[0..n-1] with XOR // value equals to x. static int xorPairCount ( int [] arr int n int x ) { int result = 0 ; // Initialize result // create empty map that stores counts of // individual elements of array. Dictionary < int int > m = new Dictionary < int int > (); for ( int i = 0 ; i < n ; i ++ ) { int curr_xor = x ^ arr [ i ]; // If there exist an element in map m // with XOR equals to x^arr[i] that means // there exist an element such that the // XOR of element with arr[i] is equal to // x then increment count. if ( m . ContainsKey ( curr_xor )) result += m [ curr_xor ]; // Increment count of current element if ( m . ContainsKey ( arr [ i ])) { var val = m [ arr [ i ]]; m . Remove ( arr [ i ]); m . Add ( arr [ i ] val + 1 ); } else { m . Add ( arr [ i ] 1 ); } } // return total count of pairs with XOR equal to x return result ; } // Driver code public static void Main ( String [] args ) { int [] arr = { 2 5 2 }; int n = arr . Length ; int x = 0 ; Console . WriteLine ( 'Count of pairs with given XOR = ' + xorPairCount ( arr n x )); } } // This code has been contributed by 29AjayKumar
JavaScript < script > // Javascript program to Count all pair with given XOR // value x // Returns count of pairs in arr[0..n-1] with XOR // value equals to x. function xorPairCount ( arr n x ) { let result = 0 ; // Initialize result // create empty map that stores counts of // individual elements of array. let m = new Map (); for ( let i = 0 ; i < n ; i ++ ) { let curr_xor = x ^ arr [ i ]; // If there exist an element in map m // with XOR equals to x^arr[i] that means // there exist an element such that the // XOR of element with arr[i] is equal to // x then increment count. if ( m . has ( curr_xor )) result += m . get ( curr_xor ); // Increment count of current element if ( m . has ( arr [ i ])) { m . set ( arr [ i ] m . get ( arr [ i ]) + 1 ); } else { m . set ( arr [ i ] 1 ); } } // return total count of pairs with XOR equal to x return result ; } // Driver program let arr = [ 2 5 2 ]; let n = arr . length ; let x = 0 ; document . write ( 'Count of pairs with given XOR = ' + xorPairCount ( arr n x )); < /script>
Ausgabe
Count of pairs with given XOR = 1
Zeitkomplexität: O(n)
Hilfsraum: O(n)