JZOJ3870 双HASH

题目就不说了。
早上打的时候随便XJBHASH了一发,结果不知道是什么原因错了一个点,懵比.jpg。
后来发现是冲突了,改了很多个质数都WA,没办法只能双hash不然搞不过去。。很久没打双hash不会打,结果被人嘲讽一波,心情复杂。

#include
#include
#include
#include
#include
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
typedef long long ll;
int mo=1000000007;
int hashing[6000007][2];
char s[1011];
int sth[1011],num[1011];
int sum[2000111],pres[2000111];
int n,i,len,j,tot,limit,length1,ans,k,l;

int get(int l,int r)
{
    return (((ll)num[r]-(ll)num[l-1]*sth[r-l+1]%mo)%mo+mo)%mo;
}
int hash(int t)
{
    int k;
    k=t%6000007;
    while(hashing[k][0]!=-1&&hashing[k][0]!=t)k=(k+1)%6000007;
    if(hashing[k][0]==-1){
        hashing[k][0]=t;
        hashing[k][1]=++tot;
    }
    return hashing[k][1];
}

int main()
{
    memset(hashing,255,sizeof(hashing));
    scanf("%d%d%d",&n,&limit,&length1);
    sth[0]=1;
    num[0]=0;
    fo(i,1,1000)
    sth[i]=(ll)sth[i-1]*26%mo;
    fo(i,1,n)
    {
        len=0;
        scanf("%s",s);
        fo(j,1,len)
        num[j]=((ll)num[j-1]*26+s[j]-'a')%mo;
        fo(j,1,len-length1+1)
        {
            l=get(j,j+length1-1);
            k=hash(l);
            if(pres[k]!=i)
            {
                pres[k]=i;
                sum[k]++;
            }
        }
    }
    fo(i,1,tot)
    if(sum[i]>=limit)ans++;
    printf("%d\n",ans);
}

你可能感兴趣的:(hash)