题目链接

题目大意

给你一个长为d只包含字符'a','b','c','?' 的字符串,?可以变成a,b,c字符,假如有x个?字符,那么有\(3^x\)个字符串,求所有字符串种子序列包含多少个abc子序列

题目思路

假如没有问号,那么就是一个简单的dp

\(dp[i][1]为前i个位置有多少个a\)

\(dp[i][2]为前i个位置有多少个ab\)

\(dp[i][3]为前i个位置有多少个abc\)

考虑 ’?‘ 会对 dp 的转移产生什么影响,因为 ‘?’ 可以将三种字母全部都表示一遍,所以到了第 i 个位置时,如果前面有 x 个 ' ? ' 的话,那么到达此位置的字符串就会有 \(3^x\) 种,如果不考虑 ' ? ' 的话,碰到一个 ' a ' \(dp[i][1]\) 就需要加一,但现在如果考虑到 ? 的影响,$dp[i][0] $就需要加上 \(3^x\) 才行

再考虑用 ' ? ' 去分别表示三种字母:

  1. ' ? ' 表示 ' a ' :前面仍然有 \(dp[i-1][1]\)个 ' a ',仍然有 \(dp[ i - 1 ][ 2 ]\) 个 ' ab ',仍然有 \(dp[i-1][3]\) 个 ' abc ',多了 3^x 个 a

  2. ' ? ' 表示 ' b ' :前面仍然有 \(dp[i-1][1]\)个 ' a ',仍然有 \(dp[ i - 1 ][ 2 ]\) 个 ' ab ',仍然有 \(dp[i-1][3]\) 个 ' abc ',多了 \(dp[i-1][1]\)个

    ’ ab ‘

  3. ' ? ' 表示 ' c ' :前面仍然有 \(dp[i-1][1]\)个 ' a ',仍然有 \(dp[ i - 1 ][ 2 ]\) 个 ' ab ',仍然有 \(dp[i-1][3]\) 个 ' abc ', 多了\(dp[i-1][2]\)个

    ' abc '

显然可以省略第一维

参考链接

代码

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
#define fi first
#define se second
#define debug printf(" I am here\n");
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int maxn=2e5+5,inf=0x3f3f3f3f,mod=1e9+7;
const double eps=1e-10;
char s[maxn];
ll dp[5];
int d;
signed main(){
dp[0]=1;
scanf("%d %s",&d,s+1);
for(int i=1;i<=d;i++){
if(s[i]=='a'){
dp[1]=(dp[1]+dp[0])%mod;
}else if(s[i]=='b'){
dp[2]=(dp[2]+dp[1])%mod;
}else if(s[i]=='c'){
dp[3]=(dp[3]+dp[2])%mod;
}else{
for(int j=3;j>=1;j--){
dp[j]=(dp[j]*3+dp[j-1])%mod;
}
dp[0]=dp[0]*3%mod;
}
}
printf("%lld\n",dp[3]);
return 0;
}

Codeforces Round #674 (Div. 3) F. Number of Subsequences 题解(dp)的更多相关文章

  1. Codeforces Round #479 (Div. 3) F. Consecutive Subsequence (简单dp)

    题目:https://codeforces.com/problemset/problem/977/F 题意:一个序列,求最长单调递增子序列,但是有一个要求是中间差值都是1 思路:dp,O(n)复杂度, ...

  2. Codeforces Round #587 (Div. 3) F Wi-Fi(线段树+dp)

    题意:给定一个字符串s 现在让你用最小的花费 覆盖所有区间 思路:dp[i]表示前i个全覆盖以后的花费 如果是0 我们只能直接加上当前位置的权值 否则 我们可以区间询问一下最小值 然后更新 #incl ...

  3. Codeforces Round #485 (Div. 2) F. AND Graph

    Codeforces Round #485 (Div. 2) F. AND Graph 题目连接: http://codeforces.com/contest/987/problem/F Descri ...

  4. Codeforces Round #486 (Div. 3) F. Rain and Umbrellas

    Codeforces Round #486 (Div. 3) F. Rain and Umbrellas 题目连接: http://codeforces.com/group/T0ITBvoeEx/co ...

  5. Codeforces Round #501 (Div. 3) F. Bracket Substring

    题目链接 Codeforces Round #501 (Div. 3) F. Bracket Substring 题解 官方题解 http://codeforces.com/blog/entry/60 ...

  6. Codeforces Round #499 (Div. 1) F. Tree

    Codeforces Round #499 (Div. 1) F. Tree 题目链接 \(\rm CodeForces\):https://codeforces.com/contest/1010/p ...

  7. Codeforces Round #524 (Div. 2)(前三题题解)

    这场比赛手速场+数学场,像我这样读题都读不大懂的蒟蒻表示呵呵呵. 第四题搞了半天,大概想出来了,但来不及(中途家里网炸了)查错,于是我交了两次丢了100分.幸亏这次没有掉rating. 比赛传送门:h ...

  8. Codeforces Round #267 (Div. 2) C. George and Job(DP)补题

    Codeforces Round #267 (Div. 2) C. George and Job题目链接请点击~ The new ITone 6 has been released recently ...

  9. Codeforces Round #325 (Div. 2) F. Lizard Era: Beginning meet in the mid

    F. Lizard Era: Beginning Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/5 ...

随机推荐

  1. B. Rock and Lever 解析(思維)

    Codeforce 1420 B. Rock and Lever 解析(思維) 今天我們來看看CF1420B 題目連結 題目 給一個數列\(a\),求有多少種\((i,j)\)使得\(i<j\) ...

  2. 面试时说Redis是单线程的,被喷惨了!

    Redis是单线程的,这话搁以前,是横着走的,谁都知道的真理.现在不一样,Redis 变了.再说这句话,多少得有质疑的语气来跟你辩驳一番.意志不坚定的,可能就缴械投降,顺着别人走了. 到底是什么样的, ...

  3. 简单粗暴套娃模式组json发送https请求

    各位童鞋大家好,向来简单粗暴的铁柱兄给大家来玩一手套娃模式来组Json数据,不说别的,无脑套. 当然,这一手比较适合临场用一下,若长期用的话建议搞一套适用的框架,只管set就好了.话不多说开始上课. ...

  4. 关于Java引用,你必须知道这些

    引用 Java 虚拟机接管了所有的内存分配与回收工作,极大地减少了程序员的工作量和错误率.GC 在回收内存时,通常采用被称为可达性分析的算法判断一个对象是否可以回收.而在可达性分析中,对象的引用有着决 ...

  5. 洛谷 P2391 白雪皑皑 线段树+优化

    题目描述: 现在有 \(N\) 片雪花排成一列. Pty 要对雪花进行$ M $次染色操作,第 \(i\)次染色操作中,把\((i*p+q)%N+1\) 片雪花和第\((i*q+p)%N+1\)片雪花 ...

  6. JVM学习(五) -执行子系统

    虚拟机和物理机的区别.两种都有代码执行能力.物理机的执行引擎是建立在处理器.硬件.指令集和操作系统上.而虚拟机的执行引擎是有自己实现的.因此可以自行的制定指令集和执行引擎的结构关系. 个人理解:分为三 ...

  7. 什么是麒麟(kylin)?查数据贼快的哟

    前言 微信搜[Java3y]关注这个有梦想的男人,点赞关注是对我最大的支持! 文本已收录至我的GitHub:https://github.com/ZhongFuCheng3y/3y,有300多篇原创文 ...

  8. wpf 全局异常捕捉+错误日志记录+自动创建桌面图标

    /// /// 创建桌面图标 /// public static void CreateShortcutOnDesktop(string LnkName) { String shortcutPath ...

  9. git clone 出现"error: RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with unexpected length was received."

    1. 最近用git pull几个大项目,总是报如下错误: error: RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with un ...

  10. Java的图形打印

    1.菱形 复制代码 package Java_Learn.File; public class Main1 { public static void main(String[] args) { pri ...