zoukankan      html  css  js  c++  java
  • 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
    ",ans2,ans1+n);
    42 }
    View Code
  • 相关阅读:
    C# bool? 逻辑运算
    C# yield return 用法与解析
    枚举器和迭代器
    C# 事件
    C# 索引器
    C# 实现单例模式的几种方法
    协变 和 逆变
    C# 结构体的特点
    装箱 和 拆箱
    继承之---对象用父类声明,用子类实例化
  • 原文地址:https://www.cnblogs.com/chujian123/p/3910951.html
Copyright © 2011-2022 走看看