কম্পিউটার

বর্ণানুক্রমিক ক্রম খুঁজুন যাতে শব্দগুলি C++-এ সাজানো বিবেচনা করা যেতে পারে


ধরুন আমাদের কাছে শব্দের একটি বিন্যাস আছে, আমাদের ইংরেজি বর্ণমালার যেকোনো বর্ণানুক্রমিক ক্রম খুঁজে বের করতে হবে যাতে প্রদত্ত শব্দগুলিকে ক্রমবর্ধমান ক্রমানুসারে সাজানো বিবেচনা করা যেতে পারে, যদি এমন কোনো ক্রম বিদ্যমান থাকে, অন্যথায় "অসম্ভব" ফেরত দিন।

সুতরাং, যদি ইনপুট শব্দের মত হয় =["efgh", "wxyz"], তাহলে আউটপুট হবে zyxvutsrqponmlkjihgfewdcba

এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -

  • বর্ণমালা :=২৬
  • n :=v এর আকার
  • যদি n 1 এর মত হয়, তাহলে −
    • "abcdefghijklmnopqrstuvwxyz" প্রদর্শন করুন
    • প্রত্যাবর্তন
  • আলফাবেট আকারের একটি অ্যারে অ্যাডজ সংজ্ঞায়িত করুন
  • আলফাবেটের আকারের একটি অ্যারে সংজ্ঞায়িত করুন এবং 0 দিয়ে পূরণ করুন
  • প্রে :=v[0]
  • আরম্ভ করার জন্য i :=1, যখন i করুন
  • s :=v[i]
  • 0 থেকে ন্যূনতম পরিসরে j-এর জন্য (পূর্বের আকার এবং s-এর আকার) - 1 −
    • যদি s[j] pre[j] এর সমান না হয়, তাহলে −
      • লুপ থেকে বেরিয়ে আসুন
    • যদি j
    • s[j] - adj[pre[j]-এর শেষে 'a'-এর ASCII - 'a'-এর ASCII যোগ করুন]
  • এ [s[j] - ASCII of 'a'] 1 দ্বারা বৃদ্ধি
  • প্রে :=s
  • নিম্নলিখিত অংশ উপেক্ষা করুন, পরবর্তী পুনরাবৃত্তিতে যান
  • যদি pre এর সাইজ হয়> s এর সাইজ, তাহলে −
    • "অসম্ভব" প্রদর্শন করুন
    • প্রত্যাবর্তন
  • প্রে :=s
  • একটি স্ট্যাক my_stack সংজ্ঞায়িত করুন
  • আরম্ভ করার জন্য i :=0, যখন i
  • যদি [i] 0 এর মত হয়, তাহলে −
    • আমি আমার_স্ট্যাকে ঢোকান
  • একটি অ্যারে আউট সংজ্ঞায়িত করুন
  • আকারের একটি বিন্যাস সংজ্ঞায়িত করুন:26. মিথ্যা দিয়ে পূরণ করুন
  • যখন (my_stack খালি নয়), −
      করুন
    • x :=my_stack এর শীর্ষ উপাদান
    • my_stack থেকে উপাদান মুছুন
    • vis[x] :=সত্য
    • আউটের শেষে 'a'-এর x + ASCII ঢোকান
    • আরম্ভ করার জন্য i :=0, যখন i
    • যদি vis[adj[x, i]] অ-শূন্য হয়, তাহলে −
      • নিম্নলিখিত অংশ উপেক্ষা করুন, পরবর্তী পুনরাবৃত্তিতে যান
    • ([adj[x, i]] 1 দ্বারা হ্রাস করুন)
    • যদি [adj[x, i]] 0 এর মত হয়, তাহলে −
      • my_stack-এ adj[x, i] ঢোকান
  • আরম্ভ করার জন্য i :=0, যখন i
  • যদি vis[i] অ-শূন্য হয়, তাহলে −
    • "অসম্ভব" প্রদর্শন করুন
  • প্রত্যাবর্তন
  • আরম্ভ করার জন্য i :=0, যখন i <সাইজ অফ আউট, আপডেট (i 1 দ্বারা বাড়ান), করুন −
    • ডিসপ্লে আউট[i]
  • উদাহরণ

    আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -

    #include <bits/stdc++.h>
    using namespace std;
    #define ALPHABET 26
    void search_ordering(vector<string> v) {
       int n = v.size();
       if (n == 1) {
          cout << "abcdefghijklmnopqrstuvwxyz";
          return;
       }
       vector<int> adj[ALPHABET];
       vector<int> in(ALPHABET, 0);
       string pre = v[0];
       for (int i = 1; i < n; ++i) {
          string s = v[i];
          int j;
          for (j = 0; j < min(pre.length(), s.length()); ++j)
             if (s[j] != pre[j])
                break;
          if (j < min(pre.length(), s.length())) {
             adj[pre[j] - 'a'].push_back(s[j] - 'a');
             in[s[j] - 'a']++;
             pre = s;
             continue;
          }
          if (pre.length() > s.length()) {
             cout << "Impossible";
             return;
          }
          pre = s;
       }
       stack<int> my_stack;
       for (int i = 0; i < ALPHABET; ++i)
          if (in[i] == 0)
             my_stack.push(i);
       vector<char> out;
       bool vis[26];
       memset(vis, false, sizeof(vis));
       while (!my_stack.empty()) {
          char x = my_stack.top();
          my_stack.pop();
          vis[x] = true;
          out.push_back(x + 'a');
          for (int i = 0; i < adj[x].size(); ++i) {
             if (vis[adj[x][i]])
                continue;
             in[adj[x][i]]--;
             if (in[adj[x][i]] == 0)
                my_stack.push(adj[x][i]);
          }
       }
       for (int i = 0; i < ALPHABET; ++i)
       if (!vis[i]) {
          cout << "Impossible";
          return;
       }
       for (int i = 0; i < out.size(); ++i)
       cout << out[i];
    }
    int main() {
       vector<string> v{"efgh", "wxyz"};
       search_ordering(v);
    }

    ইনপুট

    {"efgh", "wxyz"}

    আউটপুট

    zyxvutsrqponmlkjihgfewdcba

    1. x এর সর্বোচ্চ মান বের করুন যেমন n! C++ এ % (k^x) =0

    2. একটি অ্যারেতে সমস্ত জোড়া (a, b) খুঁজুন যেমন একটি % b =k C++ এ

    3. এমন একটি বিন্দু খুঁজুন যাতে ম্যানহাটনের দূরত্বের যোগফল C++ এ ন্যূনতম হয়

    4. প্রদত্ত পরিসরে একটি স্বতন্ত্র জোড়া (x, y) খুঁজুন যেমন x y কে C++ এ ভাগ করে