ধরুন আমাদের n সংখ্যার একটি অ্যারে আছে; আমাদের একটি অ-খালি উপসেট খুঁজে বের করতে হবে যাতে উপসেটের উপাদানগুলির যোগফল n দ্বারা বিভাজ্য হয়। সুতরাং, যখন এটি উপস্থিত থাকে তখন আমাদেরকে এর আকার এবং মূল অ্যারের উপাদানগুলির সূচক সহ এই জাতীয় যে কোনও উপসেট আউটপুট করতে হবে৷
সুতরাং, যদি ইনপুটটি [3, 2, 7, 1, 9] এর মত হয়, তাহলে আউটপুট হবে [2], [1 2]।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
- একটি মানচিত্র my_map সংজ্ঞায়িত করুন
- যোগ করুন :=0
- আরম্ভ করার জন্য i :=0, যখন i
করুন - add :=(add + arr[i]) mod N
- যদি যোগ 0 এর মত হয়, তাহলে −
- প্রিন্ট i + 1
- j শুরু করার জন্য :=0, যখন j <=i, আপডেট করুন (j 1 দ্বারা বৃদ্ধি করুন), −
- করুন
- প্রিন্ট j + 1
- প্রত্যাবর্তন
- যদি my_map-এ যোগ করা হয়, তাহলে −
- মুদ্রণ (i - my_map[add])
- আরম্ভ করার জন্য j :=my_map[add] + 1, যখন j <=i, আপডেট করুন (j 1 দ্বারা বৃদ্ধি করুন), −
- করুন
- প্রিন্ট j + 1
- প্রত্যাবর্তন
- অন্যথায়
- my_map[add] :=i
উদাহরণ (C++)
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
#include <bits/stdc++.h>
using namespace std;
void subset_find(int arr[], int N) {
unordered_map<int, int> my_map;
int add = 0;
for (int i = 0; i < N; i++) {
add = (add + arr[i]) % N;
if (add == 0) {
cout << i + 1 << endl;
for (int j = 0; j <= i; j++)
cout << j + 1 << " ";
return;
}
if (my_map.find(add) != my_map.end()) {
cout << (i - my_map[add]) << endl;
for (int j = my_map[add] + 1; j <= i; j++)
cout << j + 1 << " ";
return;
}
else
my_map[add] = i;
}
}
int main() {
int arr[] = {3, 2, 7, 1, 9};
int N = sizeof(arr) / sizeof(arr[0]);
subset_find(arr, N);
} ইনপুট
{3, 2, 7, 1, 9} আউটপুট
2 1 2