Count Good Substrings

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\n",ans2,ans1+n);
42 }
View Code

 

posted on 2014-08-13 20:01  天依蓝  阅读(197)  评论(0编辑  收藏  举报

导航