每日一題之 騰訊演算法崗筆試題 (字串Hash)
阿新 • • 發佈:2019-01-25
####描述
給定A,B兩個字串,定義如下規則
- 對於每一個A的長度為k的不同子串,統計子串在B中出現的次數
- A和B的字串係數就是所有出現次數之和。
如 A=“abab“ B = “ababab“ k = 2, A中長度為2的不同子串是ab和ba,這兩個串在b中出現的次數之和為5
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
#include <iostream>
#include <set>
#include <map>
#include <string>
using namespace std;
#define print(x) cout << x << endl
#define input(x) cin >> x
typedef long long llint;
const llint MOD = 0xdeadbeefdead; //244837814099629
const int KK = 293;
int k;
string A, B;
map<llint, int> mpa, mpb;
void calc(const string& s, map<llint, int>& mp) {
llint h = 0;
const int n = s.size();
llint u = 1;
for (int i = 0; i < n && i < k; i++) {
h = ((h * KK) % MOD + s[i]) % MOD;
}
for (int i = 0; i < k - 1; i++) {
u = (u * KK) % MOD;
}
mp[h]++;
for (int i = k; i < n; i++) {
h = ((h - u * s[i - k] % MOD) % MOD + MOD) % MOD;
h = ((h * KK) % MOD + s[i]) % MOD;
mp[h]++;
}
}
int main() {
input(k >> A >> B);
calc(A, mpa);
calc(B, mpb);
llint ans = 0;
for (const auto& p: mpa) {
ans += mpb[p.first];
}
print(ans);
return 0;
}