C. The Fair Nut and String 递推分段形dp

题意

给出一个字符串选择一个序列\({p_1,p_2...p_k}\)使得

对于任意一个\(p_i\) , \(s[p_i]==a\)

对于任意一个\(p_{i}<j<p_{i+1}\)来说 \({\exists}s[p_j]==b\)

思路

所以我们可以得知 我们需要选择一系列a 使得a和a之间只能是b

那么我们就可以对a进行分段处理

例如aaaabaaaa 右面与前面组合 只能选择后面一大串a的前缀和前面一大串a的后缀组合才合法

也就是一共有 num[1]*num[2]中组合 其中num[i] 表示第i段有多少个a

而如果多段组合的话 第三段既可以和第二段组合 也可以和第二段+第一段组合

第二段+第一段就是 在算第三段之前的合法选择数,而第三段和第二段 同第一段和第二段的算法相同

所以递推求解即可 而分段的时候如果字母不是b 直接忽略就行了(因为只是\({\exists}s[p_j]==b)\)所以不会干扰a和a的组合可以忽略,相当于归到一段a中但是这一段a的数量不变

ps:记得开long long

#include<bits/stdc++.h>
#define FOR(i,f_start,f_end) for(int i=f_start;i<=f_end;i++)
#define MS(arr,arr_value) memset(arr,arr_value,sizeof(arr))
#define F first
#define S second
#define pii pair<int ,int >
#define mkp make_pair
#define pb push_back
#define arr(zzz) array<ll,zzz>
using namespace std;
typedef long long ll;
const int maxn=3e5+5;
int n,m,y;
const int mod=1e9+7;
char s[maxn];
int main(){ scanf("%s",s+1);
int len=strlen(s+1);
long long ans=0;
for(int i=1;i<=len;i++){
if(s[i]=='a')ans++;
}
ll flag=0;
ll tmp=0;
int cnt=0;
ll x=0;
ll fixsum=0;
ll lastsum=0;
int ok=0;
for(int i=1;i<=len;i++){
if(s[i]=='a'){
flag++;
}
else if(s[i]=='b'){
if(flag){
cnt++;
tmp+=flag*fixsum;
tmp%=mod;
//ll zzzz=lastsum;
//lastsum=tmp;
tmp+=lastsum*flag;
tmp%=mod;
lastsum=tmp;
fixsum+=flag;
fixsum%=mod;
flag=0;
}
}
if(s[i]=='b')ok=0;
else if(s[i]=='a')ok=1;
}
if(ok){
cnt++;
tmp+=flag*fixsum;
tmp%=mod;
//ll zzzz=lastsum;
//lastsum=tmp;
tmp+=lastsum*flag;
tmp%=mod;
lastsum=tmp;
fixsum+=flag;
fixsum%=mod;
flag=0;
}
if(cnt>=2)ans+=tmp;
ans%=mod;
cout<<ans<<endl;
return 0;
}

C. The Fair Nut and String 递推分段形dp的更多相关文章

  1. Codeforces Round #526 (Div. 2) C. The Fair Nut and String

    C. The Fair Nut and String 题目链接:https://codeforces.com/contest/1084/problem/C 题意: 给出一个字符串,找出都为a的子序列( ...

  2. Codeforces Round #526 C - The Fair Nut and String /// 组合递推

    题目大意: 给定原字符序列 找出其中所有子序列满足 1.序列内字符都为a 2.若有两个以上的字符 则相邻两个字符在原序列中两者之间存在字符b 的数量 将整个字符序列用b分开 此时再得到每个b之间a的数 ...

  3. 递推、数位DP解析(以HDU 2089 和 HDU 3555 为例)

    HDU 2089 不要62 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2089 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人 ...

  4. CF1083B The Fair Nut and String

    题意 给出两个长度为n的01字符串S和T. 选出k个字典序在S和T之间的长度为n的01字符串,使得尽可能多的字符串满足其是所选字符串中至少一个串的前缀. 这是一道思路比较奇怪的类似计数dp的题. 首先 ...

  5. hdu 4055 Number String(递推DP)

    给一个只含‘I','D','?'三种字符的字符串,I表示当前数字大于前面的数字,D表示当前的数字小于前面一位的数字,?表示当前位既可以小于又可以大于. 问1~n的排列中有多少个满足该字符串. http ...

  6. 递推,动态规划(DP),字符串处理,最佳加法表达式

    看了一些资料,竟然发现连百度文库也有错误的地方,在这里吐槽一下题目大意:http://wenku.baidu.com/link?url=DrUNNm19IqpPNZjKPX4Jg6shJiK_Nho6 ...

  7. UVA 11077 - Find the Permutations(递推)

    UVA 11077 - Find the Permutations option=com_onlinejudge&Itemid=8&page=show_problem&cate ...

  8. 2018牛客网暑期ACM多校训练营(第一场)B Symmetric Matrix(思维+数列递推)

    题意 给出一个矩阵,矩阵每行的和必须为2,且是一个主对称矩阵.问你大小为n的这样的合法矩阵有多少个. 分析 作者:美食不可负064链接:https://www.nowcoder.com/discuss ...

  9. HDU 6198 2017沈阳网络赛 线形递推

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6198 题意:给出一个数k,问用k个斐波那契数相加,得不到的数最小是几. 解法:先暴力打表看看有没有规律 ...

随机推荐

  1. IIS安装与部署,站点的部署与配置

    第一章:IIS安装与部署 一,服务器概念的理解: 将设计好的软件只要部署到一台机器(服务器--->IIS)上,其它的员工通过浏览器(网址.)来进行访问. 做好的网站必须部署到这台机器上的IIS中 ...

  2. 虚拟化系列-VMware vSphere 5.1 简介与安装

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://mabofeng.blog.51cto.com/2661587/1017680 一 ...

  3. 怎样增加phpmyadmin导入文件上限

    1 2 3 分步阅读 百度经验:jingyan.baidu.com phpMyAdmin 是一个用PHP编写的,可以通过 web 方式控制和操作 MySQL 数据库.因为操作简单被广大的使用mysql ...

  4. IOS AppStore上线前测试

    IOS  AppStore上线前测试 TestFlight Beta ios 8才开始支持. https://developer.apple.com/library/ios/documentation ...

  5. python爬虫(10)--PyQuery的用法

    简介 pyquery 可让你用 jQuery 的语法来对 xml 进行操作.这I和 jQuery 十分类似.如果利用 lxml,pyquery 对 xml 和 html 的处理将更快. 初始化 在这里 ...

  6. linux 创建docker基础镜像

    通过Dockerfile创建镜像时,一般都是基于 Docker Hub 提供的官方镜像.以下分别介绍在ubuntu16和centos7 两个系统上创建个人私有基础镜像的方法.  一.ubuntu16创 ...

  7. android中音频播放的两种方法

    方法1.通过MediaPlayer播放,可播放本地,网络音频,适合播放单个文件 方法2.通过SoundPool,适合播放多个文件 详见:http://www.cnblogs.com/xiaoQLu/a ...

  8. [cf557d]Vitaly and Cycle(黑白染色求奇环)

    题目大意:给出一个 n 点 m 边的图,问最少加多少边使其能够存在奇环,加最少边的情况数有多少种. 解题关键:黑白染色求奇环,利用数量分析求解. 奇环:含有奇数个点的环. 二分图不存在奇环.反之亦成立 ...

  9. Python 黑客 --- 002 入门级 ZIP压缩文件口令暴力破解机

    Python 黑客 入门级实战:ZIP压缩文件口令暴力破解机 使用的系统:Ubuntu 14.04 LTS Python语言版本:Python 2.7.10 V 编写zip 压缩文件口令破解器需要使用 ...

  10. K-D TREE算法原理及实现

    博客转载自:https://leileiluoluo.com/posts/kdtree-algorithm-and-implementation.html k-d tree即k-dimensional ...