9305:买花(flower)(2)
【问题描述】
重阳节前,小肥来到“HF花店”为爷爷奶奶购买鲜花。花店里共有m(1≤m≤26)种,n枝鲜花排成一列,每枝花的品种用小写英文字母表示。花店规定,顾客必须购买位置连续的若干枝鲜花。小肥则希望,不论购买的鲜花里有多少品种,每种花都恰好有k枝。
请计算出小肥有多少种购买鲜花的方案。
【输入】
输入的第一行包含2个正整数n和k。
接下来一行,包含一个长度为n且由小写英文字母构成的字符串。其中第i个字符代表第i枝花的品种。
【输出】
输出一行,其中包含一个整数,表示小肥购买鲜花的方案数。
【数据范围】
对于所有测试数据,保证:1≤n≤10⁵,1≤k≤1000。
【输入样例】
9 3
aaabcbcc
【输出样例】
3
#include<bits/stdc++.h>
using namespace std;
long long ans;
int t[256],m;
int he[26][100010];
int main()
{
int n,k,i,j;
string s;
cin>>n>>k;
cin>>s;
s="#"+s;
for(i=1;i<s.size();i++)
{
t[s[i]]++;
if(t[s[i]]==1)
{
m++;
}
for(j=0;j<26;j++)
{
he[j][i]=he[j][i-1];
}
he[s[i]-'a'][i]++;
}
for(i=1;i<=m;i++)
{
for(j=1;j+i*k-1<=s.size();j=j+1)
{
bool f=1;
for(int p=0;p<26;p++)
{
if(he[p][j+i*k-1]-he[p][j-1]!=0)
{
if(he[p][j+i*k-1]-he[p][j-1]!=k)
{
f=0;
break;
}
}
}
if(f==1)
{
ans++;
}
}
}
cout<<ans;
}