Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

C++ में विशिष्ट इको सबस्ट्रिंग

मान लीजिए हमारे पास एक स्ट्रिंग एस है; हमें S के अलग-अलग गैर-रिक्त सबस्ट्रिंग्स की संख्या ज्ञात करनी है जिन्हें स्वयं के साथ कुछ स्ट्रिंग के संयोजन के रूप में लिखा जा सकता है।

इसलिए, यदि इनपुट "एलोएलोएलो" जैसा है, तो आउटपुट 5 होगा, क्योंकि "एलो", "लोई", "लोएल", "ओएल" जैसे कुछ सबस्ट्रिंग हैं।

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • प्राइम :=31

  • मी :=1^9 + 7

  • एक फ़ंक्शन को परिभाषित करें FastPow(), यह आधार, शक्ति लेगा,

  • रेस :=1

  • जबकि पावर> 0, करें -

    • अगर शक्ति और 1 शून्य नहीं है, तो -

      • रेस:=रेस * बेस

      • रेस :=रेस मॉड एम

    • आधार:=आधार * आधार

    • आधार:=आधार मॉड एम

    • पावर =पावर / 2

  • रिटर्न रेस

  • createHashValue() फ़ंक्शन को परिभाषित करें, इसमें s, n,

    . लगेगा
  • परिणाम:=0

  • इनिशियलाइज़ i:=0 के लिए, जब i

    • परिणाम:=परिणाम + (एस [i] * फास्टपाउ (प्राइम, आई))

    • परिणाम:=परिणाम मोड एम

  • वापसी परिणाम

  • एक फ़ंक्शन को परिभाषित करें पुनर्गणना हैश (), इसमें पुराना, नया सी, पुराना हैश, पेटलेंथ,

    लगेगा
  • न्यूहैश:=पुरानाहैश - पुराना

  • newHash :=newHash * FastPow(prime, m - 2)

  • newHash :=newHash + (newC * FastPow(prime, patLength-1))

  • newHash :=newHash mod m

  • नया हैश लौटाएं

  • मुख्य विधि से निम्न कार्य करें -

  • n :=टेक्स्ट का आकार

  • एक सेट उत्तर परिभाषित करें

  • इनिशियलाइज़ i :=2 के लिए, जब i <=n, अपडेट i :=i + 2, करें -

    • अस्थायी:=खाली स्ट्रिंग

    • इनिशियलाइज़ j :=0 के लिए, जब j

      • अस्थायी:=अस्थायी + पाठ [जे]

    • हैश1 :=createHashValue(temp, i/2)

    • अस्थायी:=खाली स्ट्रिंग)

    • इनिशियलाइज़ j :=i / 2 के लिए, जब j

      • अस्थायी:=अस्थायी + पाठ [जे]

    • हैश2 :=createHashValue(temp, i/2)

    • प्रारंभ करने के लिए s1 :=0, e1 :=i/2, s2 :=i/2, e2 :=i, जब e2

      • अगर हैश1 हैश2 के समान है, तो

        • हैश1 को उत्तर में डालें

      • हैश 1:=पुनर्गणना हैश (पाठ [एस 1], पाठ [ई 1], हैश 1, आई / 2)

      • हैश 2:=पुनर्गणना हैश (पाठ [एस 2], पाठ [ई 2], हैश 2, आई / 2)

    • अगर हैश1 हैश2 के समान है, तो

      • हैश1 को उत्तर में डालें

  • उत्तर का वापसी आकार

आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

उदाहरण

#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
const lli prime = 31;
const lli m = 1e9 + 7;
class Solution {
   public:
   lli fastPow(lli base, lli power){
      lli res = 1;
      while (power > 0) {
         if (power & 1) {
            res = res * base;
            res %= m;
         }
         base *= base;
         base %= m;
         power >>= 1;
      }
      return res;
   }
   lli createHashValue(string s, lli n){
      lli result = 0;
      for (lli i = 0; i < n; i++) {
         result += (lli)(s[i] * fastPow(prime, i));
         result %= m;
      }
      return result;
   }
   lli recalculateHash(char old, char newC, lli oldHash, lli
   patLength){
      lli newHash;
      newHash = oldHash - (lli)old;
      newHash *= fastPow(prime, m - 2);
      newHash += ((lli)newC * fastPow(prime, patLength - 1));
      newHash %= m;
      return newHash;
   }
   int distinctEchoSubstrings(string text){
      int n = text.size();
      set<int> ans;
      for (int i = 2; i <= n; i += 2) {
         string temp = "";
         for (int j = 0; j < i / 2; j++) {
            temp += text[j];
         }
         int hash1 = createHashValue(temp, i / 2);
         temp = "";
         for (int j = i / 2; j < i; j++) {
            temp += text[j];
         }
         int hash2 = createHashValue(temp, i / 2);
         for (int s1 = 0, e1 = i / 2, s2 = i / 2, e2 = i; e2 < n;
         s1++, s2++, e1++, e2++) {
            if (hash1 == hash2) {
               ans.insert(hash1);
            }
            hash1 = recalculateHash(text[s1], text[e1], hash1,
            i / 2);
            hash2 = recalculateHash(text[s2], text[e2], hash2,
            i / 2);
         }
         if (hash1 == hash2) {
            ans.insert(hash1);
         }
      }
      return ans.size();
   }
};
main(){
   Solution ob;
   cout << (ob.distinctEchoSubstrings("elloelloello"));
}

इनपुट

"elloelloello"

आउटपुट

5

  1. सबस्ट्रिंग की संख्या 8 से विभाज्य है और C++ में 3 से नहीं

    0-9 की एक स्ट्रिंग दी गई है। इस समस्या के लिए, हमें उन स्ट्रिंग्स की संख्या की गणना करने की आवश्यकता है जो 8 से विभाज्य हैं और 3 से नहीं। यह एक 2 कदम की समस्या है, और हमें इसे हल करने के लिए एक बार में कोड को एक कदम करने की आवश्यकता है, उदाहरण के लिए इनपुट str = "80" आउटपुट 2 इनपुट s

  1. C++ में पूर्णांकों की एक स्ट्रिंग में 6 से विभाज्य सबस्ट्रिंग की संख्या

    हम एक समस्या को देखेंगे जिसमें हमें एक पूर्णांक स्ट्रिंग दी गई है और यह निर्धारित करना होगा कि पूर्णांक प्रारूप में कितने सबस्ट्रिंग 6 से विभाज्य हैं। यह ध्यान दिया जाना चाहिए कि इनपुट संख्याओं (पूर्णांक) से बने स्ट्रिंग के रूप में है। फिर भी, विभाज्यता जांच इसे केवल एक पूर्णांक के रूप में मानते हुए

  1. C++ का उपयोग करके एक स्ट्रिंग के सबस्ट्रिंग की संख्या ज्ञात करें

    इस लेख में, आप किसी दिए गए स्ट्रिंग में बनाए जा सकने वाले सबस्ट्रिंग (गैर-रिक्त) की संख्या को खोजने के तरीकों के बारे में जानेंगे। Input : string = “moon” Output : 10 Explanation: Substrings are ‘m’, ‘o’, ‘o’, ‘n’, ‘mo’, &lsqu