zoukankan      html  css  js  c++  java
  • Codeforces Round #526 C

    题目大意:

    给定原字符序列

    找出其中所有子序列满足

    1.序列内字符都为a

    2.若有两个以上的字符 则相邻两个字符在原序列中两者之间存在字符b

    的数量

    将整个字符序列用b分开

    此时再得到每个b之间a的数量

    即 abbgaaba 得到 v[] = { 1 0 2 1 }

    此时假设到第 i-1 段 已得到在第 i-1 段内的所有方案数为 ans (长度为1、2、3、... 、i-1)

    则在第 i 段时 可由前一段的方案数 和 当前段数量 组合得到ans*v[ i ] (长度为2、3、4、... 、i)

    此时第 i 段还可以作为长度为1的方案 即ans=ans*v[ i ] + v[ i ]=(ans+1)*v[ i ]

    那么递推即可得到所有方案数

    #include <bits/stdc++.h>
    #define LL long long
    #define INF 0x3f3f3f3f
    using namespace std;
    const int N=1e5+5;
    const int mod=1e9+7;
    char ch[N];
    LL v[N];
    int main()
    {
        while(~scanf("%s",ch)) {
            int len=strlen(ch);
            memset(v,0,sizeof(v));
            v[0]=1LL;
            int i=0, c=1;
            while(i<len) {
                LL m=0LL;
                while(i<len && ch[i]!='b') {
                    if(ch[i]=='a') m++;
                    i++;
                }
                v[c++]=m;
                i++;
            }
            LL ans=0LL;
            for(int j=1;j<=c;j++)
                ans=(ans+(ans+1LL)*v[j]%mod)%mod;
            printf("%I64d
    ",ans);
        }
    
        return 0;
    }
    View Code
  • 相关阅读:
    数组的复制
    二维数组的切片和索引
    一维数组的切片和索引
    is判断函数
    其他方式创建数组
    ndarray对象属性
    创建随机数组
    arange创建数组
    SmartBinding与kbmMW#3
    SmartBinding与kbmMW#2
  • 原文地址:https://www.cnblogs.com/zquzjx/p/10104289.html
Copyright © 2011-2022 走看看