কম্পিউটার টিউটোরিয়াল

C++-এ মোট হ্যামিং দূরত্ব (Total Hamming Distance) গণনা

একটি সংখ্যা লিস্ট দেওয়া থাকলে, সব যুগল সংখ্যার হ্যামিং দূরত্বের যোগফল বের করতে হবে। দুটি পূর্ণসংখ্যার হ্যামিং দূরত্ব হলো তাদের বাইনারি রিপ্রেজেন্টেশনে পার্থক্যপূর্ণ বিটের সংখ্যা।

উদাহরণ

ইনপুট: [4, 14, 17, 2] → আউটপুট: 17

সমাধানের ধাপসমূহ

  1. প্রতিটি বিট পজিশন (০ থেকে ৩১) এর জন্য আলাদা আলাদা গণনা করুন।
  2. প্রতিটি সংখ্যার জন্য, ওই বিট পজিশনে ১ আছে কিনা চেক করুন।
  3. যে সংখ্যাগুলোতে ১ আছে তাদের সংখ্যা count1, যেগুলোতে ০ আছে তাদের count0 = n - count1।
  4. ওই বিটের জন্য হ্যামিং দূরত্বের অবদান = count1 * count0।
  5. সকল বিটের যোগফল নিন।

প্রোগ্রাম উদাহরণ

#include <bits/stdc++.h>
using namespace std;

typedef long long int lli;
const int m = 1e9 + 7;

class Solution {
public:
    lli add(lli a, lli b) {
        return ((a % m) + (b % m)) % m;
    }
    
    lli mul(lli a, lli b) {
        return ((a % m) * (b % m)) % m;
    }
    
    int cntBits(vector<int>& a) {
        vector<vector<lli>> bits(32, vector<lli>(2));
        lli ans = 0;
        int n = a.size();
        
        for (int i = 0; i < n; i++) {
            lli x = a[i];
            for (lli j = 0; j < 32; j++) {
                lli b = (x >> j) & 1;
                ans = add(ans, mul(1, bits[j][!b]));
                bits[j][b] = add(bits[j][b], 1);
            }
        }
        return ans;
    }
    
    int totalHammingDistance(vector<int>& nums) {
        return cntBits(nums);
    }
};

int main() {
    Solution ob;
    vector<int> v = {4, 14, 17, 2};
    cout << (ob.totalHammingDistance(v));
}

ইনপুট

{4, 14, 17, 2}

আউটপুট

17
  1. জাভাস্ক্রিপ্টে স্ট্রিংয়ের হ্যামিং দূরত্ব (Hamming Distance) বের করা

  2. সি++ কোড: ম্যাট্রিক্সের মোট উপাদান সংখ্যা বের করুন

  3. C++-এ প্রথম N সংখ্যা K দূরত্বে রি-অ্যারেঞ্জ করুন

  4. মোট n বিন্দু এবং m সংরেখ বিন্দু দিয়ে ত্রিভুজের গণনা (C++ প্রোগ্রাম)