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