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)$.

  1. First, change the $x_i$-th character from the beginning of $S$ to $c_i$.
  2. 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$ with 0 or 1 independently.

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: 100 and 110. 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的更多相关文章

  1. 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 ...

  2. Profiling MySQL queries from Performance Schema

    转自:http://www.percona.com/blog/2015/04/16/profiling-mysql-queries-from-performance-schema/ When opti ...

  3. 数据结构(线段树):CodeForces 145E Lucky Queries

    E. Lucky Queries time limit per test 3 seconds memory limit per test 256 megabytes input standard in ...

  4. 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 ...

  5. 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. ...

  6. 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 ...

  7. HDU6191(01字典树启发式合并)

    Query on A Tree Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Othe ...

  8. 01: docker 基本使用

    1.1 docker基础 1.docker与虚拟机比较 2.docker版本 1. 社区版(Community Edition, CE) 2. 企业版(Enterprise Edition, EE) ...

  9. Codeforces Round #371 (Div. 2) C. Sonya and Queries 水题

    C. Sonya and Queries 题目连接: http://codeforces.com/contest/714/problem/C Description Today Sonya learn ...

  10. CSS3 响应式web设计,CSS3 Media Queries

    两种方式,一种是直接在link中判断设备的尺寸,然后引用不同的css文件: <link rel="stylesheet" type="text/css" ...

随机推荐

  1. 数据可视化【原创】vue复合数字形式展示

    做数据可视化的时候,经常碰到需要很灵活的数字形式展示. 先上个效果图: 如图包括名称,数量,别名,单位,上升下降,环比等等的复合数据展示,并且需要支持样式灵活配置. 此组件包括2个模块,父容器组件bo ...

  2. 【故障公告】一而再,再而三,三翻四复:数据库服务器 CPU 100%

    会员救园,故障捣乱,每当困难时,故障们总是喜欢雪上加霜过来考验你. 今天下班前 17:43~17:47 期间,园子的 SQL Server 数据库服务器突然出现 CPU 100% 问题. 发现问题后, ...

  3. github.com/yuin/gopher-lua 踩坑日记

    本文主要记录下在日常开发过程中, 使用 github.com/yuin/gopher-lua 过程中需要注意的地方. 后续遇到其他的需要注意的事项再补充. 1.加载LUA_PATH环境变量 在实际开发 ...

  4. jQuery Ajax执行顺序问题

    代码如下: $(document).ready(function () { var res; $.ajax({ type: 'post', url: 'GridDemo.aspx/PlaceOrder ...

  5. Spring中事务的传播行为有哪些?

    Spring中事务的传播行为有哪些? 现在我们来谈一个场景,再来引出事务传播行为这个概念.现在有methodA( ) 和 methodB( ),而且两个方法都显示的开启了事务,那么methodB( ) ...

  6. WorkPress使用BackWPup插件备份后手动还原方法记录

    前提 拿到BackWPup插件备份的zip包(下文均以backup.zip来指代).这个是备份包是事先从源WorkPress上备份好的. 环境 OS:Centos7.9 Apache:2.4.6 PH ...

  7. Record - Dec. 1st, 2020 - Exam. REC

    Prob. 1 Desc. & Link. 行走的形式是比较自由的,因为只要走到了最优答案处就可以不管了,所以不需要考虑游戏的结束. 考虑二分答案. 然后预处理出每个节点到 \(s\)(另一棵 ...

  8. 低代码平台如何借助Nginx实现网关服务

    摘要:本文由葡萄城技术团队于博客园原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 在典型的系统部署架构中,应用服务器是一种软件或硬件系统, ...

  9. QQ机器人整理合集

    QQ机器人有什么用呢? QQ机器人可以实现包括自动回复.定时推送.发送图片QQ机器人,营销圈用的比较多,可以开发各种自动功能等等.用其制作的QQ机器人程序 机器人框架+插件 小栗子机器人 官网:htt ...

  10. PTA乙级1099

    #include"bits/stdc++.h" using namespace std; int prime(int x) { if(x<2) return 0; for(i ...