HDU 5907 Find Q

本文介绍了一种算法问题,即在一个长字符串中寻找所有仅由字母'q'组成的连续子串,并提供了一个高效的O(n)解决方案。通过遍历字符串并记录'q'出现的位置,可以计算出所有符合条件的子串数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Find Q

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/131072 K (Java/Others)
Total Submission(s): 1384    Accepted Submission(s): 608


Problem Description
Byteasar is addicted to the English letter 'q'. Now he comes across a string S consisting of lowercase English letters.

He wants to find all the continous substrings of S, which only contain the letter 'q'. But this string is really really long, so could you please write a program to help him?
 

Input
The first line of the input contains an integer T(1T10), denoting the number of test cases.

In each test case, there is a string S, it is guaranteed that S only contains lowercase letters and the length of S is no more than 100000.
 

Output
For each test case, print a line with an integer, denoting the number of continous substrings of S, which only contain the letter 'q'.
 

Sample Input
2 qoder quailtyqqq
 

Sample Output
1 7

题意:给出一个字符串,求该字符串有多少只含q字母的连续子串。

思路:O(n)复杂度遍历,当遇到一个第一个q时,st标记起点,一直往后走,只到发现不为q的字母,然后用(len + 1) * len / 2  公式求得该子串包含有多少个子串。注意处理边界情况。

代码如下:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
char s[100005];
int main(){
	int cases, i, st, n, len, flag;
	long long sum, x;//注意数据范围 
	cin>>cases;
	while(cases--){
		scanf("%s", s);
 		len = strlen(s);
 		flag = false;//若已经发现了起点,则flag=true 
 		sum = 0;
 		for(i = 0; i < len; i++){
			if(s[i] == 'q' && flag == false){//发现起点 
				st = i;
				flag = true;
			}
			if(s[i] != 'q' && flag){//在发现起点的情况下开始找到了不是q的字符 
				x = i - st;
				sum += (1 + x) * x / 2;
				flag = false;
			}
			if(s[i] == 'q' && i == len - 1 && flag) {//若字符串最后一个字符为q 
				x = i - st + 1;
				sum += (1 + x) * x / 2;
			}
	 	}
	 	cout<<sum<<endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值