题目链接

题目大意

给你一个长为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. Linux 系统编程 学习:11-线程:线程同步

    Linux 系统编程 学习:11-线程:线程同步 背景 上一讲 我们介绍了线程的属性 有关设置.这一讲我们来看线程之间是如何同步的. 额外安装有关的man手册: sudo apt-get instal ...

  2. linux用户及组相关文件介绍

    用户和组文件介绍 1.用户账号文件:passwd passwd命令用于设置用户的认证信息,包括用户密码.密码过期时间等.系统管理者则能用它管理系统用户的密码.只有管理者可以指定用户名称,一般用户只能变 ...

  3. IOCP 模型2 AcceptEx

    // IOCP2.cpp : Defines the entry point for the console application. // #include "stdafx.h" ...

  4. Nginx是什么?有什么用?

    一.Nginx是什么 Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服 ...

  5. Markdown tricks

    编辑排版 仅仅了解 Markdown 语法还不够,知道这些 排版技巧 增色您的文章内容. 空格和空行 留白,从艺术角度上说,留白就是以"空白"为载体进而渲染出美的意境的艺术.从应用 ...

  6. 「APIO2015」巴邻旁之桥 Palembang Bridges

    贪心 先转化一下题意 首先如果一个人的家和办公室在河同一侧那么建桥的时候不用去考虑它,最终把答案加上即可 在河两侧的家和办公室互换不影响答案,那么可以把这个抽象到一个区间$[l,r]$,距离就是$|l ...

  7. Cuda常用概念及注意点

    线程的索引计算 只需要知并行线程的初始索引,以及如何确定递增的量值,我们希望每个并行线程从不同的索引开始,因此就需要对线程索引和线程块索引进行线性化,每个线程的其实索引按照以下公式来计算: int t ...

  8. sendfile zero-copy

    传统read/write进行网络文件传输过程当中,文件数据实际上经过四次copy操作: 硬盘->内核buf->用户buf->socket相关缓冲区->协议引擎 而sendfil ...

  9. MySQL索引结构之B+树索引(面)

    首先要明白索引(index)是在存储引擎(storage engine)层面实现的,而不是server层面.不是所有的存储引擎都支持所有的索引类型.即使多个存储引擎支持某一索引类型,它们的实现和行为也 ...

  10. 第14章——高级IO函数

    1.套接字超时 套接字IO函数设置超时的方法有三种: (1)调用alarm. (2)select (3)使用SO_RECTIMEO和 SO_SNDTIMEO 选项 上面三种方法适用于输入输出操作(re ...