F题解

对于n个数进行哈希那么题目等价于hash(1,n-2k)+hash(2k+1,n)=2hash(k+1,n-k)

通过o(n)枚举k就可以得出结果

#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef unsigned long long ULL;
const int N = 1e6 + 5, P = 131;
ULL p[N], h[N];
ULL find(int l, int r)
{
    return h[r] - h[l - 1] * p[r - l + 1];
}
signed main()
{
    ios_base::sync_with_stdio(0); cin.tie(0), cout.tie(0);
    int n;
    cin >> n;
    vector<int>a(n);
    p[0] = 1;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
        p[i + 1] = p[i] * P;
        h[i + 1] = h[i] * P + a[i];
    }
    for (int k = 1; k <= n; k++) {
        if (find(1, n - 2 * k) + find(2 * k + 1, n) == 2 * find(k + 1, n - k)) {
            cout << k << "\n";
            return 0;
        }
    }
}

全部评论
不过这一步转化是等价的吗,会不会有的地方a_i + a_{i + 2k} != 2 * a_{i + k},但是一段加起来之后会相等。就是这个转化感觉是充分不必要的
点赞
送花
回复 分享
发布于 07-01 10:23 上海
对于n个数进行哈希那么题目等价于hash(1,n-2k)+hash(2k+1,n)=2hash(k+1,n-k) 这句没看懂
点赞
送花
回复 分享
发布于 07-01 20:37 河北
现代汽车中国前瞻数字研发中心
校招火热招聘中
官网直投

相关推荐

4 收藏 评论
分享
牛客网
牛客企业服务