2024年合肥市科普日小学组市赛第二题题解

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值