C. The Fair Nut and String 递推分段形dp
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的更多相关文章
- 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的子序列( ... 
- Codeforces Round #526 C - The Fair Nut and String /// 组合递推
		题目大意: 给定原字符序列 找出其中所有子序列满足 1.序列内字符都为a 2.若有两个以上的字符 则相邻两个字符在原序列中两者之间存在字符b 的数量 将整个字符序列用b分开 此时再得到每个b之间a的数 ... 
- 递推、数位DP解析(以HDU 2089 和 HDU 3555 为例)
		HDU 2089 不要62 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2089 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人 ... 
- CF1083B The Fair Nut and String
		题意 给出两个长度为n的01字符串S和T. 选出k个字典序在S和T之间的长度为n的01字符串,使得尽可能多的字符串满足其是所选字符串中至少一个串的前缀. 这是一道思路比较奇怪的类似计数dp的题. 首先 ... 
- hdu 4055 Number String(递推DP)
		给一个只含‘I','D','?'三种字符的字符串,I表示当前数字大于前面的数字,D表示当前的数字小于前面一位的数字,?表示当前位既可以小于又可以大于. 问1~n的排列中有多少个满足该字符串. http ... 
- 递推,动态规划(DP),字符串处理,最佳加法表达式
		看了一些资料,竟然发现连百度文库也有错误的地方,在这里吐槽一下题目大意:http://wenku.baidu.com/link?url=DrUNNm19IqpPNZjKPX4Jg6shJiK_Nho6 ... 
- UVA 11077 - Find the Permutations(递推)
		UVA 11077 - Find the Permutations option=com_onlinejudge&Itemid=8&page=show_problem&cate ... 
- 2018牛客网暑期ACM多校训练营(第一场)B Symmetric Matrix(思维+数列递推)
		题意 给出一个矩阵,矩阵每行的和必须为2,且是一个主对称矩阵.问你大小为n的这样的合法矩阵有多少个. 分析 作者:美食不可负064链接:https://www.nowcoder.com/discuss ... 
- HDU 6198 2017沈阳网络赛 线形递推
		题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6198 题意:给出一个数k,问用k个斐波那契数相加,得不到的数最小是几. 解法:先暴力打表看看有没有规律 ... 
随机推荐
- 12-01JavaScript事件(Events)
			JS事件 1.js事件通常和函数结合来使用,这样可以通过发生的事件来驱动函数的执行,从而引起html出现不同的效果. 2.属性(当这些事件的属性发生时,会触发function{}的函数): 1)ona ... 
- 问题:table 可否实现对角线;结果:HTML 斜线 表头
			<HTML> <HEAD> <TITLE>斜线表头</TITLE> </HEAD> <script Language=&q ... 
- No result defined for action action.LoginAction and result success 问题解决
			转自:https://blog.csdn.net/dongzhout/article/details/43699699 搭建好SSH2框架,写一个简单的登陆功能,提交表单的时候遇到这个问题: 配置文件 ... 
- DAY11-MYSQL数据操作
			一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的 ... 
- 两种布局的ListVIew Adapter。例如微信对话界面
			这个界面 实现的不是微信对话界面.实现的是,focus的状态下,变为放大的另一种布局 重点: 一.定义类型个数 private final int TYPE_COUNT = 2; privat ... 
- with上下文管理基础
			import queue import contextlib import time @contextlib.contextmanager def worker_state(xxx,val): xxx ... 
- 无人驾驶——4.控制之MPC模型预测控制
			源自:<无人驾驶无人驾驶车辆模型预测控制>——龚建伟 参考:https://wenku.baidu.com/view/8e4633d519e8b8f67c1cb9fa.html 0.车辆模 ... 
- Blender 基础 骨架 01
			Blender 基础 骨架 01 我使用的Blender版本:Blender V 2.77 前言 本讲介绍: 骨架的基本使用方式. 骨架是角色动画里面最常使用的元素,它可以准确控制一个模型的变形,尤其 ... 
- Java-数据结构与算法-选择排序与冒泡排序
			Java 选择排序与冒泡排序 1.DataSorter.java public class DataSorter { //冒泡排序法 //主要思路:按升序排序,数组元素两两比较,大的立即排后面 pub ... 
- zookeeper生成节点、删除节点 For Java
			源码地址https://github.com/Bellonor/myhadoop2.x/tree/master/myhadoop2.x/src/main/java/com/jamesfen/zooke ... 
