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