কম্পিউটার

পাইথনে বিভিন্ন প্রশ্নের জন্য একটি স্ট্রিংয়ের বিভিন্ন সাবস্ট্রিংয়ের সংখ্যা খুঁজে বের করার প্রোগ্রাম


ধরুন আমাদের একটি স্ট্রিং s আছে যার দৈর্ঘ্য n। আমাদের কাছে প্রশ্নগুলির একটি তালিকাও রয়েছে, যেখানে Q[i] একটি জোড়া (l, r) রয়েছে। প্রতিটি প্রশ্নের জন্য আমাদেরকে l এবং r-এর মধ্যে অন্তর্ভুক্ত পরিসরে s-এর বিভিন্ন সাবস্ট্রিং-এর সংখ্যা গণনা করতে হবে।

সুতরাং, যদি ইনপুটটি s ="ppqpp" Q =[(1,1),(1,4),(1,1),(0,2)] এর মত হয়, তাহলে আউটপুট হবে [1,8, 1,5] কারণ

  • প্রশ্নের জন্য (1, 1) একমাত্র সাবস্ট্রিং হল 'p' তাই আউটপুট হল 1

  • প্রশ্নের জন্য (1, 4) সাবস্ট্রিংগুলি হল 'p', 'q', 'pq', 'qp', 'pp', 'pqp', 'qpp' এবং 'pqpp', তাই আউটপুট হল 8

  • আবার কোয়েরির জন্য (1, 1) একমাত্র সাবস্ট্রিং হল 'p' তাই আউটপুট হল 1

  • কোয়েরির জন্য (0, 2) সাবস্ট্রিংগুলি হল 'p', 'q', 'pp', 'pq', 'ppq', তাই আউটপুট হল 8৷

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

  • একটি ফাংশন সংজ্ঞায়িত করুন kasai()। এটি s, suff, n
  • লাগবে
  • lcp :=n আকারের একটি অ্যারে এবং 0 দিয়ে পূরণ করুন
  • inv :=n আকারের একটি অ্যারে এবং 0 দিয়ে পূরণ করুন
  • আমি 0 থেকে n - 1 রেঞ্জের জন্য, কর
    • inv[suff [i]] :=i
  • k :=0
  • আমি 0 থেকে n - 1 রেঞ্জের জন্য, কর
    • যদি inv [i] n-1 এর মত হয়, তাহলে
      • k :=0
      • পরবর্তী পুনরাবৃত্তির জন্য যান
    • j :=suff[inv [i] + 1]
    • যদিও i + k
    • k :=k + 1
  • lcp[inv [i]] :=k
  • যদি k> 0, তারপর
    • k :=k - 1
  • lcp ফেরত দিন
  • প্রধান পদ্ধতি থেকে, নিম্নলিখিতগুলি করুন -
  • res :=একটি নতুন তালিকা
  • আমি 0 থেকে Q - 1 এর আকারের জন্য,
      করুন
    • (বাম, ডানে) :=প্রশ্ন[i]
    • sub :=সূচক বাম থেকে ডানে s এর সাবস্ট্রিং
    • দৈর্ঘ্য :=ডান-বাম + 1
    • প্রত্যয় :=0 থেকে দৈর্ঘ্য - 1 পর্যন্ত প্রতিটি i-এর জন্য জোড়ার একটি তালিকা (i, সূচক i থেকে শেষ পর্যন্ত সাব-স্ট্রিং)
    • পেয়ার সাবস্ট্রিংয়ের দ্বিতীয় আইটেমের উপর ভিত্তি করে প্রত্যয় সাজান
  • (suff, suffix) =সূচকের জোড়া এবং প্রত্যয় থেকে সংশ্লিষ্ট সাবস্ট্রিং
    • lcp :=কসাই(sub, suff, length)
    • গণনা :=প্রত্যয়ের আকার[0]
    • আমি 0 থেকে দৈর্ঘ্য-2 এর মধ্যে, কর
      • গণনা :=গণনা + প্রত্যয়ের আকার[i + 1] - lcp[i]
    • রেজের শেষে গণনা ঢোকান
  • রিটার্ন রিটার্ন
  • উদাহরণ

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

    def kasai (s, suff, n):
       lcp = [0] * n
       inv = [0] * n
       for i in range (n):
          inv [suff [i]] = i
       k = 0
       for i in range (n):
          if inv [i] == n-1:
             k = 0
             continue
          j = suff [inv [i] + 1]
          while i + k <n and j + k <n and s [i + k] == s [j + k]:
             k += 1
          lcp [inv [i]] = k
          if k> 0:
             k -= 1
       return lcp
    
    def solve(s, Q):
       res = []
       for i in range (len(Q)):
          left, right = Q[i]
          sub = s [left: right + 1]
          length = right-left + 1
    
          suffix = [[i, sub [i:]] for i in range (length)]
    
          suffix.sort (key = lambda x: x [1])
          suff, suffix = [list (t) for t in zip (* suffix)]
    
          lcp = kasai (sub, suff, length)
          count = len (suffix [0])
          for i in range (length-1):
             count += len (suffix [i + 1]) - lcp [i]
    
          res.append(count)
       return res
    
    s = "pptpp"
    Q = [(1,1),(1,4),(1,1),(0,2)]
    print(solve(s, Q))

    ইনপুট

    "pptpp", [(1,1),(1,4),(1,1),(0,2)]
    

    আউটপুট

    [1, 8, 1, 5]

    1. একটি সংখ্যার বিজোড় গুণনীয়কের যোগফল খুঁজে বের করার জন্য পাইথন প্রোগ্রাম

    2. একটি সংখ্যার জোড় গুণকের যোগফল খুঁজে বের করার জন্য পাইথন প্রোগ্রাম

    3. সংখ্যার ন্যূনতম যোগফল নির্ণয়ের জন্য পাইথন প্রোগ্রাম

    4. একটি সংখ্যার বৃহত্তম মৌলিক ফ্যাক্টর খুঁজে বের করার জন্য পাইথন প্রোগ্রাম