1 条题解
-
2
很容易想到一个 的做法。
即一层暴力移位,一层暴力 ,一层 。
哈希字符串 , 层降为 。哈希预处理 个 ,丢到 里单次查询降为 。
#include <bits/stdc++.h> using i64 = long long; using ll = long long; using ull = unsigned long long; using uint = unsigned int; constexpr int mod = 1E9 + 7; template <class T> struct Hash { const int N; const ull P = 13331; std::vector<T> p, S; Hash(int _) : N(_), p(_ + 1), S(_ + 1) {} Hash(std::string s) : Hash(int(s.size())) { p[0] = 1; for (int i = 1; i <= N; ++i) { p[i] = p[i - 1] * P; } for (int i = 1; i <= N; ++i) { S[i] = S[i - 1] * P + 1ull * s[i - 1]; } } T get_sub(int l, int r) { return S[r] - S[l - 1] * p[r - l + 1]; } }; void solve() { std::string A, B; std::cin >> A >> B; Hash<ull> hasb(B), hasa(A); const int n = int(A.size()), lenb = int(B.size()); std::map<ull, bool> map; map.emplace(hasa.get_sub(1, n), true); for (int l = n, r = n; l > 1; --l) { auto t = hasa.get_sub(l, r); map.emplace(t * hasa.p[l - 1] + hasa.S[l - 1], true); } int ans = 0; for (int i = 0; i + n - 1 < lenb; ++i) { ans += map.count(hasb.get_sub(i + 1, i + n)); } std::cout << ans << "\n"; } int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int t; std::cin >> t; while (t--) { solve(); } return 0; }
信息
- ID
- 21
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 28
- 已通过
- 3
- 上传者