Codeforces Round #258 (Div. 2) D:http://codeforces.com/problemset/problem/451/D
题意:给你一个字符串,只有ab组成。相同的字符可以消除一个,如果最终的串是一个回文串,那么原来的串就是一个good string.问长度为奇数和偶数的串各有多少个。
题解:只要观察到,这样的串开头的字母和最后一个字母是相同的,那么题目就简单了。我们只要从左到右扫一遍就可以了。统计之前出现过的偶位数上a有多少。奇数位上a有多少,偶数位上b有多少,奇数位上b有多少,对于当前位是a,如果这一位是偶数,那么奇数串的个数就是加上之前偶数位的a的个数,偶数串的个数就是加上之前奇数位上a的个数,其他的情况类似得到。然后更新偶数位a的个数。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int N=1e5+10; 7 char str[N]; 8 long long odda,oddb; 9 long long evena,evenb; 10 long long ans1,ans2; 11 int main(){ 12 scanf("%s",str); 13 int n=strlen(str); 14 odda=oddb=evena=evenb=ans1=ans2=0; 15 for(int i=0;i<n;i++){ 16 if(str[i]=='a'){ 17 if((i+1)&1){ 18 ans1+=odda; 19 ans2+=evena; 20 odda++; 21 } 22 else{ 23 ans1+=evena; 24 ans2+=odda; 25 evena++; 26 } 27 } 28 else { 29 if((i+1)&1){ 30 ans1+=oddb; 31 ans2+=evenb; 32 oddb++; 33 } 34 else{ 35 ans1+=evenb; 36 ans2+=oddb; 37 evenb++; 38 } 39 } 40 } 41 printf("%I64d %I64d ",ans2,ans1+n); 42 }