//本题题意:给你一个字符串和两个整数 m,l。让你找字符串中有多少个满足条件的字串。
//条件1:字串长度ml(意思就是由m个长度为l的连续的小字串组成),条件2:m个小子串各不相同。
//思路:hash字符串+map
#include<bits/stdc++.h>
#define ull unsigned long long
using namespace std;
#define base 131
#define maxn 100010
ull h[maxn],q[maxn];
map<ull,int >mp;
ull gethash(int l,int r){//获取字符串hash
return h[r]-h[l-1]*q[r-l+1];
}
char s[maxn];
//hash初始化
void init (){
int n=strlen(s+1);
h[0]=0;
q[0]=1;
for(int i=1;i<=n;i++){
h[i]=h[i-1]*base+s[i]-'a'+1;
q[i]=q[i-1]*base;
}
}
int main(){
int m,l;
while(scanf("%d%d",&m,&l)!=EOF){
scanf("%s",s+1);
init();
int ans=0;
int len=strlen(s+1);
for(int i=1;i<=l&&i+m*l-1<=len;i++){
mp.clear();
for(int j=i;j<i+m*l;j+=l){
ull x=gethash(j,j+l-1);
mp[x]++;
}
if(mp.size()==m)ans++;
for(int j=i+m*l;j+l-1<=len;j+=l){//加尾减首法
ull x=gethash(j,j+l-1);
mp[x]++;
ull y=gethash(j-m*l,j-m*l+l-1);
mp[y]--;
if(mp[y]==0)mp.erase(y);
if(mp.size()==m)ans++;
}
}
printf("%d\n",ans);
}
return 0;
}
05-13
2297