-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy path19.longestDuplicateSubstring.cpp
61 lines (61 loc) · 1.73 KB
/
19.longestDuplicateSubstring.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
class Solution {
vector<int> power;
string ret;
int prime=19260817;
public:
string rabincarp(string &s,int &k){
if(k==0) return "";
long long int hash=0;
unordered_map<int,vector<int> > mp;
for(int i=k-1;i>=0;i--){
hash=(hash%prime+(power[k-1-i]*(s[i]-'a'+1))%prime)%prime;
}
int i=0,j=k-1;
mp[hash]=vector<int>(1,0);
bool flag=0;
while(j<s.size()){
hash=(hash%prime-((power[k-1]*(s[i]-'a'+1))%prime)+prime)%prime;
hash=(hash%prime*26%prime)%prime;
i++;
j++;
if(j<s.size()){
hash=(hash%prime+((power[0]*(s[j]-'a'+1))%prime))%prime;
if(mp.find(hash)!=mp.end()){
for(auto ind:mp[hash]){
if (strcmp((s.substr(ind,k)).data(), s.substr(i, k).data()) == 0) {
return s.substr(ind,k);
}
}
mp[hash].push_back(i);
}
else{
mp[hash]=vector<int>(1,i);
}
}
}
return "";
}
string longestDupSubstring(string S) {
power.resize(S.size()+1);
power[0]=1;
for(int i=1;i<=S.size();i++){
power[i]=(26*power[i-1])%prime;
}
int l=0,r=S.size();
string ans="";
while(l<=r){
int mid=l+(r-l)/2;
string valid=rabincarp(S,mid);
if(valid.size()>0){
if(valid.size()>ans.size()){
ans=valid;
}
l=mid+1;
}
else{
r=mid-1;
}
}
return ans;
}
};