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

被折叠的 条评论
为什么被折叠?



