字符串Hash模板:
//使用 hash[i]=(hash[i-1]*p+idx(s[i]))%mod 求得前缀为i的hash值,
//利用 hash[l..r]=(hash[r]-hash[l-1]*(p^(r-1+1)))%mod 求得s[l,r]的hash值.
//(注意l=0的问题,以及hash[l..r] < 0时要 +mod)
const ll p = 1e7+9;
const ll mod = 1e9+7;
ll Pow[N];
ll Hash[N];
char s1[1005];
char s2[1005];
int len1,len2;
void init() //预处理字符串1的hash值
{
Pow[0]=1;
Hash[0]=s1[0]%mod;
for(int i=1;i<=len1;i++) //注意这里要处理到等于len1,因为算次幂有可能有这个值
Pow[i] = Pow[i-1]*p%mod; //预处理p的幂值
for(int i=1;i<len1;i++)
Hash[i]=(Hash[i-1]*p%mod)+s1[i]%mod;
}
ll get(int l,int r)
{
if(l==0)
return ((Hash[r]-0*Pow[r-l+1])%mod+mod)%mod;
else
return ((Hash[r]-Hash[l-1]*Pow[r-l+1])%mod+mod)%mod;
}
int Get_count() //求出s2在s1中出现次数,不可重叠
{
init();
ll haha = 0;
for(int i=0;i<len2;i++)
haha = (haha*p%mod+s2[i]%mod)%mod; //求出匹配串s2的hash值
ll res=0;
for(int i=0;i+len2-1<len1;)
{
ll hs = get(i,i+len2-1)%mod;
if(hs==haha)
{
i+=len2;
res++;
}
else
i++;
}
return res;
}