asfd

#include <bits/stdc++.h>
#define M 200010
using namespace std;
char s[M];
int i,n,m;
struct set_hash{
    int hash_pow[M];
    int hash_val[M];
    int p,P;
    void _init(int p_,int P_)
    {     p=p_; P=P_;
        hash_pow[0]=1; 
           for(i=1;i<=n;i++)
           {
           hash_val[i]=(1ll*hash_val[i-1]*p+s[i]-'a'+1)%P;
           hash_pow[i]=1ll*hash_pow[i-1]*p%P;
           }
    }
    int _get_hash_val(int l,int r)
    {
        return (hash_val[r]-1ll*hash_val[l-1]*hash_pow[r-l+1]%P+P)%P;
    }
}ha,hb;
int HA[M],HB[M],t;
int main(){
    scanf("%d%d%s",&n,&m,s+1);
    ha._init(61,1000000007);
    hb._init(97,1000000009);
    for(i=1;i+m-1<=n;i++)
    {
           HA[i]=ha._get_hash_val(i,i+m-1);
           HB[i]=hb._get_hash_val(i,i+m-1);
    }
    sort(HA+1,HA+n-m+2);
    sort(HB+1,HB+n-m+2);
    t=1;
    for(i=2;i<=n-m+1;i++)
    {   
        if(HA[i]!=HA[i-1]||HB[i]!=HB[i-1])
          t++;
    }
    printf("%d",t);
}

猜你喜欢

转载自www.cnblogs.com/Lamboofhome/p/11643948.html
asd