####描述
给定A,B两个字符串,定义如下规则
- 对于每一个A的长度为k的不同子串,统计子串在B中出现的次数
- A和B的字符串系数就是所有出现次数之和。
如 A=“abab“ B = “ababab“ k = 2, A中长度为2的不同子串是ab和ba,这两个串在b中出现的次数之和为5
####思路
字符串Hash的黑魔法,详细介绍https://blog.csdn.net/pengwill97/article/details/80879387
#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;
}