1 条题解

  • 0
    @ 2026-9-24 23:23:08

    P3560 [POI2013] LAN-Colorful Chain

    我们需要先求出目标串的 hash 值。

    先求出每个数的 hash 值,再将目标串的每个数的 hash 值乘上各自出现次数,加和即可得到。

    同理求出原串每个长度为目标串长度的串的 hash 值,随便比较一下,并记录答案即可。

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    const int mod = 1e9 + 7 , base = 13331;
    int n , m , hsh[1000010] , sum[1000010] , l[1000010] , c[1000010] , a[1000010] , len , ans , res;
    signed main()
    {
        scanf("%lld%lld" , &n , &m);
        hsh[0] = 1;
        for(int i = 1 ; i <= n ; i ++) hsh[i] = hsh[i - 1] * base % mod;
        for(int i = 1 ; i <= m ; i ++) scanf("%lld" , &l[i]) , len += l[i];
        for(int i = 1 , x ; i <= m ; i ++) scanf("%lld" , &x) , res += hsh[x] * l[i] % mod , res %= mod;
        for(int i = 1 , x ; i <= n ; i ++) scanf("%lld" , &x) , sum[i] = (sum[i - 1] + hsh[x]) % mod;
        for(int i = 1 ; i + len - 1 <= n ; i ++) ans += ((sum[i + len - 1] - sum[i - 1] + mod) % mod == res);
        printf("%lld" , ans);
        return 0;
    }
    
    • 1

    信息

    ID
    4877
    时间
    1000ms
    内存
    228MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者