90分,wa3,求反例
查看原帖
90分,wa3,求反例
480823
Nreyog楼主2024/7/10 21:29
#include <bits/stdc++.h>
#define int long long
#define endl '\n'

using namespace std;

struct String_hash {

    int mod = 1e9 + 7;
    static int base;
    vector<int> pre, p;

    String_hash() {}
    String_hash(string s) {
        int n = s.size();
        pre.resize(n + 1);
        p.resize(n + 1);
        p[0] = 1;

        if (base == 0) {
            mt19937 rng = mt19937(static_cast<unsigned int>(time(0)));
            uniform_int_distribution<int> dist(100, 233);
            base = dist(rng);
        }

        for (int i = 0; i < n; i++) {
            p[i + 1] = 1LL * p[i] * base % mod;
            pre[i + 1] = (1LL * pre[i] * base % mod + s[i] - 'a' + 1) % mod;
        }
    }

    int get_hash(int l, int r) {
        l++, r++;
        return ((pre[r] - 1LL * pre[l - 1] * p[r - l + 1] % mod) % mod + mod) % mod;
    }
};

int String_hash::base = 0;


signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cout << fixed << setprecision(15);
    int n;
    cin >> n;
    vector<string> s(n);
    for (int i = 0; i < n; i++) {
        int len;
        cin >> len;
        cin >> s[i];
    }
    sort(s.begin(), s.end(), [](string& a, string& b) {
        return a.size() < b.size();
    });
    vector<String_hash> S(n), T(n);
    for (int i = 0; i < n; i++) {
        S[i] = String_hash(s[i]);
        string t = s[i];
        reverse(t.begin(), t.end());
        T[i] = String_hash(t);
    }
    map<int, int> cnt;
    int res = 0;
    for (int i = 0; i < n; i++) {
        int len = s[i].size();
        cnt[S[i].get_hash(0, len - 1)]++;
        res += cnt[T[i].get_hash(0, len - 1)];
        for (int j = 0; j < len - 1; j++) {
            int l1 = 0, r1 = j;
            int l2 = len - 1 - j, r2 = len - 1;
            if (S[i].get_hash(l1, r1) == T[i].get_hash(l2, r2)) {
                res += cnt[T[i].get_hash(0, len - 2 - j)];
            }
        }
    }
    
    cnt.clear();
    for (int i = 0; i < n; i++) {
        int len = s[i].size();
        cnt[T[i].get_hash(0, len - 1)]++;
        res += cnt[S[i].get_hash(0, len - 1)];
        for (int j = 1; j < len; j++) {
            int l1 = j, r1 = len - 1;
            int l2 = 0, r2 = len - j - 1;
            if (S[i].get_hash(l1, r1) == T[i].get_hash(l2, r2)) {
                res += cnt[S[i].get_hash(0, j - 1)];
            }
        }
    }
    for (int i = 0; i < n; i++) {
        int len = s[i].size();
        if (S[i].get_hash(0, len - 1) == T[i].get_hash(0, len - 1)) {
            res--;
        }
    }
    cout << res << endl;
    return 0;
}

2024/7/10 21:29
加载中...