मान लीजिए हमारे पास एक स्ट्रिंग एस है; हमें 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