1 条题解

  • 2
    @ 2024-8-2 8:39:17

    很容易想到一个 n3n^3 的做法。

    即一层暴力移位,一层暴力 BB ,一层 checkcheck

    哈希字符串 AAcheckcheck 层降为 O(1)O(1) 。哈希预处理 nnA(K)A(K) ,丢到 mapmap 里单次查询降为 O(log)O(log)

    #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;
    }
    
    
    • 1

    信息

    ID
    21
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    28
    已通过
    3
    上传者