很坑的一道题啊,之前还以为是字符串处理+DP呢
结果卢学长说他用20+行的代码A的...然后看着他rating一路狂飙200+,冲上1700
之后看了学长的代码才知道这个题是数学题...
因为只有a b两个字母组成,所以一个good substring只需首尾字母相同即可
所以我们只用统计奇数位置、偶数位置a b的个数即可
代码如下:
#include <cstdio>
#include <iostream>
#define MAXN 100010
#define LL long long
using namespace std;
/*
* a表示偶数位置字符为a的个数
* b表示奇数位置字符为a的个数
* c表示偶数位置字符为b的个数
* d表示奇数位置字符为b的个数
*/
LL f(LL x) {
return x*(x-1)/2;
}
LL a, b, c, d, ans1, ans2;
string str;
int main(void) {
int i;
while(cin >> str) {
a = b = c = d = 0;
for(i=0; i<str.size(); ++i) {
if(i & 1)
str[i]=='a' ? b++ : d++;
else
str[i]=='a' ? a++ : c++;
}
ans1 = a*b+c*d;
ans2 = f(a)+f(b)+f(c)+f(d)+str.size();
cout << ans1 << " " << ans2 << endl;
}
return 0;
}