Count Good Substrings
64-bit integer IO format: %I64d Java class name: (Any)
Given a string, you have to find two values:
- the number of good substrings of even length;
- the number of good substrings of odd length.
Input
The first line of the input contains a single string of length n (1 ≤ n ≤ 105). Each character of the string will be either 'a' or 'b'.
Output
Print two space-separated integers: the number of good substrings of even length and the number of good substrings of odd length.
Sample Input
bb
1 2
baab
2 4
babb
2 5
babaa
2 7
Hint
In example 1, there are three good substrings ("b", "b", and "bb"). One of them has even length and two of them have odd length.
In example 2, there are six good substrings (i.e. "b", "a", "a", "b", "aa", "baab"). Two of them have even length and four of them have odd length.
In example 3, there are seven good substrings (i.e. "b", "a", "b", "b", "bb", "bab", "babb"). Two of them have even length and five of them have odd length.
Definitions
A substring s[l, r] (1 ≤ l ≤ r ≤ n) of string s = s1s2... sn is string slsl + 1... sr.
A string s = s1s2... sn is a palindrome if it is equal to string snsn - 1... s1.
Source
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <climits> 7 #include <vector> 8 #include <queue> 9 #include <cstdlib> 10 #include <string> 11 #include <set> 12 #include <stack> 13 #define LL long long 14 #define INF 0x3f3f3f3f 15 using namespace std; 16 LL odd[2],even[2],x,y; 17 char str[100100]; 18 int main(){ 19 while(~scanf("%s",str)){ 20 memset(odd,0,sizeof(odd)); 21 memset(even,0,sizeof(even)); 22 x = y = 0; 23 for(int i = 0; str[i]; i++){ 24 int sb = str[i]-'a'; 25 if(i&1){ 26 x += odd[sb];//奇数到奇数是奇数 27 y += even[sb];//奇数到偶数是偶数 28 odd[sb]++; 29 }else{ 30 x += even[sb]; 31 y += odd[sb]; 32 even[sb]++; 33 } 34 } 35 printf("%I64d %I64d ",y,x+strlen(str)); 36 } 37 return 0; 38 }