[ABC246Ex] 01? Queries
Problem Statement
You are given a string $S$ of length $N$ consisting of 0, 1, and ?.
You are also given $Q$ queries $(x_1, c_1), (x_2, c_2), \ldots, (x_Q, c_Q)$.
For each $i = 1, 2, \ldots, Q$, $x_i$ is an integer satisfying $1 \leq x_i \leq N$ and $c_i$ is one of the characters 0 , 1, and ?.
For $i = 1, 2, \ldots, Q$ in this order, do the following process for the query $(x_i, c_i)$.
- First, change the $x_i$-th character from the beginning of $S$ to $c_i$.
- Then, print the number of non-empty strings, modulo $998244353$, that can be obtained as a (not necessarily contiguous) subsequence of $S$ after replacing each occurrence of
?in $S$ with0or1independently.
Constraints
- $1 \leq N, Q \leq 10^5$
- $N$ and $Q$ are integers.
- $S$ is a string of length $N$ consisting of
0,1, and?. - $1 \leq x_i \leq N$
- $c_i$ is one of the characters
0,1, and?.
Input
Input is given from Standard Input in the following format:
$N$ $Q$
$S$
$x_1$ $c_1$
$x_2$ $c_2$
$\vdots$
$x_Q$ $c_Q$
Output
Print $Q$ lines. For each $i = 1, 2, \ldots, Q$, the $i$-th line should contain the answer to the $i$-th query $(x_i, c_i)$ (that is, the number of strings modulo $998244353$ at the step 2. in the statement).
Sample Input 1
3 3
100
2 1
2 ?
3 ?
Sample Output 1
5
7
10
The $1$-st query starts by changing $S$ to
110. Five strings can be obtained as a subsequence of $S = $110:0,1,10,11,110. Thus, the $1$-st query should be answered by $5$.The $2$-nd query starts by changing $S$ to
1?0. Two strings can be obtained by the?in $S = $1?0:100and110. Seven strings can be obtained as a subsequence of one of these strings:0,1,00,10,11,100,110. Thus, the $2$-nd query should be answered by $7$.The $3$-rd query starts by changing $S$ to
1??. Four strings can be obtained by the?'s in $S = $1??:100,101,110,111. Ten strings can be obtained as a subsequence of one of these strings:0,1,00,01,10,11,100,101,110,111. Thus, the $3$-rd query should be answered by $10$.
Sample Input 2
40 10
011?0??001??10?0??0?0?1?11?1?00?11??0?01
5 0
2 ?
30 ?
7 1
11 1
3 1
25 1
40 0
12 1
18 1
Sample Output 2
746884092
532460539
299568633
541985786
217532539
217532539
217532539
573323772
483176957
236273405
Be sure to print the count modulo $998244353$.
如果这个问题不是动态的,那要怎么做?想到dp做法。
定义 \(dp_{i,0/1}\) 为在前 \(i\) 个字符的所有子序列中,如果再加上 \(0/1\) 这个字符后,就不是前 \(i\) 个字符的子序列了的子序列个数。
那么如果遇到一个 \(1\),那么就相当于给所有加上 \(1\) 不属于前 \(i\) 个数的子序列加上了一个 \(1\),\(dp_{i,1}=dp_{i-1,1}\),然后新生成的这些子序列肯定再加上 \(0\) 后不属于前面的子序列,\(dp_{i,0}=dp_{i-1,1}+dp_{i-1,0}\).
如果遇到一个 \(0\) ,同理。遇到一个问好,\(dp_{i,1}=dp_{i,0}=dp_{i-1,1}+dp_{i-1,0}\)。
另开一个变量统计答案就可以了。
然后就要开始动态 dp,设 \((dp_0,dp_1,ans)\)为一个向量
遇到一个\(1\),向量乘上 \(\begin{Bmatrix}1&0&0\\1&1&1\\0&0&1 \end{Bmatrix}\)
遇到一个\(0\),向量乘上 \(\begin{Bmatrix}1&1&1\\0&1&0\\0&0&1 \end{Bmatrix}\)
遇到一个\(?\),向量乘上 \(\begin{Bmatrix}1&1&1\\1&1&1\\0&0&1 \end{Bmatrix}\)
剩下的就是用线段树维护矩阵乘法,单点修改,区间查询就可以了。
#include<bits/stdc++.h>
const int N=1e5+5,P=998244353;
int n,q,x;
char c;
struct matrix{
int a[4][4];
}t[3],tr[N<<2],p,dw;
matrix cheng(matrix a,matrix b)
{
matrix c;
memset(c.a,0,sizeof(c.a));
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
for(int k=1;k<=3;k++)
c.a[i][j]+=1LL*a.a[i][k]*b.a[k][j]%P,c.a[i][j]%=P;
return c;
}
int turn(char c)
{
if(c<='1')
return c-'0';
return 2;
}
void copy(matrix&a,matrix b)
{
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
a.a[i][j]=b.a[i][j];
}
void build(int o,int l,int r)
{
// printf("%d %d %d\n",o,l,r);
if(l>r)
return;
if(l==r)
{
scanf(" %c",&c);
copy(tr[o],t[turn(c)]);
return;
}
int md=l+r>>1;
build(o<<1,l,md);
build(o<<1|1,md+1,r);
copy(tr[o],cheng(tr[o<<1],tr[o<<1|1]));
}
void update(int o,int l,int r,int x,int y)
{
if(l==r)
{
copy(tr[o],t[y]);
return;
}
int md=l+r>>1;
if(md>=x)
update(o<<1,l,md,x,y);
else
update(o<<1|1,md+1,r,x,y);
copy(tr[o],cheng(tr[o<<1],tr[o<<1|1]));
}
int main()
{
scanf("%d%d",&n,&q);
p.a[1][1]=p.a[1][2]=1;
dw.a[1][1]=dw.a[2][2]=dw.a[3][3]=1;
for(int i=0;i<(N<<2);i++)
copy(tr[i],dw);
t[0].a[1][1]=t[0].a[2][1]=t[0].a[2][2]=t[0].a[2][3]=t[0].a[3][3]=1;
t[1].a[1][1]=t[1].a[1][2]=t[1].a[1][3]=t[1].a[2][2]=t[1].a[3][3]=1;
t[2].a[1][1]=t[2].a[1][2]=t[2].a[1][3]=t[2].a[2][1]=t[2].a[2][2]=t[2].a[2][3]=t[2].a[3][3]=1;
build(1,1,n);
while(q--)
{
scanf("%d %c",&x,&c);
update(1,1,n,x,turn(c));
printf("%d\n",cheng(p,tr[1]).a[1][3]);
}
}
[ABC246Ex] 01? Queries的更多相关文章
- Codeforces Round #371 (Div. 2) C. Sonya and Queries[Map|二进制]
C. Sonya and Queries time limit per test 1 second memory limit per test 256 megabytes input standard ...
- Profiling MySQL queries from Performance Schema
转自:http://www.percona.com/blog/2015/04/16/profiling-mysql-queries-from-performance-schema/ When opti ...
- 数据结构(线段树):CodeForces 145E Lucky Queries
E. Lucky Queries time limit per test 3 seconds memory limit per test 256 megabytes input standard in ...
- Save results to different files when executing multi SQL statements in DB Query Analyzer 7.01
1 About DB Query Analyzer DB Query Analyzer is presented by Master Genfeng,Ma from Chinese Mainl ...
- The new powerful SQL executing schedule monthly or weekly in DB Query Analyzer 7.01
1 About DB Query Analyzer DB Query Analyzer is presented by Master Genfeng,Ma from Chinese Mainland. ...
- DB Query Analyzer 6.01 is released, SQL Execute Schedule function can be used
DB Query Analyzer is presented by Master Gen feng, Ma from Chinese Mainland. It has English versi ...
- HDU6191(01字典树启发式合并)
Query on A Tree Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Othe ...
- 01: docker 基本使用
1.1 docker基础 1.docker与虚拟机比较 2.docker版本 1. 社区版(Community Edition, CE) 2. 企业版(Enterprise Edition, EE) ...
- Codeforces Round #371 (Div. 2) C. Sonya and Queries 水题
C. Sonya and Queries 题目连接: http://codeforces.com/contest/714/problem/C Description Today Sonya learn ...
- CSS3 响应式web设计,CSS3 Media Queries
两种方式,一种是直接在link中判断设备的尺寸,然后引用不同的css文件: <link rel="stylesheet" type="text/css" ...
随机推荐
- 使用.NET Jieba.NET 的 PosSegmenter 实现中文分词匹配
目录 引言 1. 什么是中文分词 2. Jieba.NET简介 3. PosSegmenter介绍 4. 实现中文分词匹配 4.1 安装Jieba.NET库 4.2 创建PosSegmenter实 ...
- Excelize 开源基础库 2.8.0 版本正式发布
Excelize 是 Go 语言编写的用于操作电子表格办公文档的开源基础库,基于 ISO/IEC 29500.ECMA-376 国际标准.可以使用它来读取.写入由 Microsoft Excel.WP ...
- pythonapi接口怎么对接?
Python API接口对接是使用Python语言开发应用程序时,与外部API接口进行交互的一种方式.API(应用程序接口)是一种定义了程序或系统如何与另一个程序或系统进行交互的协议.通过使用Py ...
- [项目源码] JavaWeb校园宿舍管理系统
jsp校园宿舍管理系统源码,采用Servlet+JSP+MySQL.包含数据库文件,界面采用bootstrap,简洁大方. 项目导入eclipse后的目录结构如下: 关注下面公众号,下载源码
- 修复linux系统更新后Conky无法启动的问题
kali系统更新后的版本为 ~$uname -a Linux 4rk 5.9.0-kali5-amd64 #1 SMP Debian 5.9.15-1kali1 (2020-12-18) x86_64 ...
- sqoop1.4.7完全支持Hadoop3.x, Hive3.x Hbase2.x
已经修改好 保存至云盘 自己下载 花了时间的,记得关注我... 链接:https://pan.xunlei.com/s/VNe6P6Tm1A9Q-RG5GByN08rdA1# 提取码:5nke 复制这 ...
- Games101现代计算机图形学入门 - 作业1~8 集合含提高项总结
Github 地址 :Games101 作业总结 Games101 官网:Games101 - 现代图形学入门 记录 Games101 Homework 系列 1 ~ 8 及相关作业提高项 环境安装 ...
- WebApi中添加Jwt鉴权
前言 JSON Web Token(JWT)是一个非常轻巧的规范.这个规范允许我们使用 JWT 在用户和服务器之间传递安全可靠的信息.一个 JWT 实际上就是一个字符串,它由三部分组成,头部.载荷与签 ...
- 使用SemanticKernel 进行智能应用开发(2023-10更新)
以OpenAI 的ChatGPT 所掀起的GenAI 快速创新浪潮,其中连接LLM 和 应用之间的桥梁的两大开源项目:LangChain[1]和Semantic Kernel[2] ,在半年前写过一篇 ...
- Strimzi Kafka Bridge(桥接)实战之三:自制sdk(golang版本)
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<Strimzi Kafka B ...