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