题目就不说了。
早上打的时候随便XJBHASH了一发,结果不知道是什么原因错了一个点,懵比.jpg。
后来发现是冲突了,改了很多个质数都WA,没办法只能双hash不然搞不过去。。很久没打双hash不会打,结果被人嘲讽一波,心情复杂。
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#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);
}