1. 程式人生 > >每日一題之 騰訊演算法崗筆試題 (字串Hash)

每日一題之 騰訊演算法崗筆試題 (字串Hash)

####描述
給定A,B兩個字串,定義如下規則

  1. 對於每一個A的長度為k的不同子串,統計子串在B中出現的次數
  2. 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; }