字符计数

 题目

2. K13629 字符计数

题目描述

给定一个全部由小写字母组成的字符串S,设X是S的一个连续子串,如果X中包含的任何字符出现的次数都不超过K,则称X是一个合法的子串。对于给定的S和X,请计算合法的子串的数量。

输入格式

第1行:一个正整数T,表示测试数据的组数,每组测试数据包含两行:

第1行:一个有小写字母组成的字符串S。

第2行:一个正整数K。

输出格式

每组数据输出一行:表示合法的连续子串的数量。

输入输出样例
输入样例1:复制
3
abc
1
abcabc
1
abcabc
2
输出样例1:复制
6
15
21
说明
【数据范围】

1 <= T <= 100; 1 <= S.size() <= 100000; 1 <= K <= 100000;

【耗时限制】1000ms 【内存限制】128MB

 解答

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL t,cnt[130],ans,x;
string s;
int main(){
	cin>>t;
	while(t--){
		memset(cnt,0,sizeof cnt);
		cin>>s>>x;
		LL l=0,sum=0,ans=0;
		for(LL r=0;r<s.size();r++){
			cnt[s[r]]++;
			while(l<r && cnt[s[r]]>x){
				cnt[s[l]]--;
				l++;
			}
			ans+=r-l+1;
		}
		printf("%lld\n",ans);
	}
	return 0;
}

评测记录

  • 17
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值