#include<iostream>
#include<string>
using namespace std
;
string a
;
int al
;
string b
;
int bl
;
long long d
= 1073741824;
long long calcuStr(string tmp
) {
long long rst
= 0;
for (int i
= 0; i
< tmp
.length(); i
++) {
rst
+= tmp
[i
] - 95 + i
;
}
return rst
% d
;
}
long long upDate(long long rst
, char a
, char b
) {
return rst
- a
+ b
;
}
bool match() {
int hashA
= calcuStr(a
.substr(0, bl
));
int hashB
= calcuStr(b
);
for (int i
= 1; i
< al
- bl
+ 1; i
++) {
if (hashA
== hashB
) {
bool isEqual
= true;
for (int j
= 0; j
< bl
; j
++) {
if (a
[j
+ i
- 1] != b
[j
]) {
isEqual
= false;
break;
}
}
if (isEqual
) return true;
}
else {
hashA
= upDate(hashA
, a
[i
- 1], a
[i
+ bl
- 1]);
}
}
return false;
}
int main() {
while (cin
>> a
>> b
) {
al
= a
.length();
bl
= b
.length();
cout
<< match() << endl
;
}
}
关于哈希值更新算法的解释
转载请注明原文地址: https://mac.8miu.com/read-489453.html