Replacement

CodeForces - 570C

话说很久很久以前,孙悟空被压在了山下,很无聊。于是他找了一个只包含小写字母和字符"." 的字符串。 由于他比较无聊,他就开始了换点点,他找到字符串中第一个出现的"..",然后把其换成"."。 如果字符串中不包含"..",换点点操作对字符串无效

现在定义一个值f(s),表示使字符串不包含".."的最小 换点点 操作次数。

你现在需要处理m个询问, 第i个询问时,你需要把字符串中的 xi (1 ≤ xi ≤ n) 位置的字符替换成 ci。替换后,输出 f(s)的值。

这下孙悟空一脸懵逼,快来帮帮他~

Input

第一行包括两个整数 n 和 m (1 ≤ n, m ≤ 300 000) ,分别表示字符串长度和询问次数。

第二行包含一个长度为n的字符串,字符串只包含小写字母和字符"."

接下来m行描述询问。第i行包括 xi 和 ci (1 ≤ xi ≤ nci — 一个小写字母或一个字符".")

Output

输出m个数字,每个一行 ,输出执行第i个替换后的f(s)值。

Example

Input
10 3
.b..bz....
1 h
3 c
9 f
Output
4
3
1
Input
4 4
.cc.
2 .
3 .
2 a
1 a
Output
1
3
1
1

Note

第一个样例

初始串:".b..bz....".

  • 第一次询问: f(hb..bz....) = 4    ("hb[..]bz...."  →  "hb.bz[..].."  → "hb.bz[..]."  →  "hb.bz[..]"  →  "hb.bz.")
  • 第二次询问: f(hbс.bz....) = 3    ("hbс.bz[..].."  →  "hbс.bz[..]."  → "hbс.bz[..]"  →  "hbс.bz.")
  • 第三次询问: f(hbс.bz..f.) = 1    ("hbс.bz[..]f."  →  "hbс.bz.f.")

第二个样例

初始串:".cc.".

  • 第一次询问: f(..c.) = 1    ("[..]c."  →  ".c.")
  • 第二次询问: f(....) = 3    ("[..].."  →  "[..]."  →  "[..]"  →  ".")
  • 第三次询问:f(.a..) = 1    (".a[..]"  →  ".a.")
  • 第四次询问:f(aa..) = 1    ("aa[..]"  →  "aa.")

sol:有加强版的是区间修改(我一眼秒了)--摘自某大佬原话

我太菜了,于是只会做弱化弱化弱化弱化版

首先很显然的东西,合并的次数= '.' 的个数和连续的 '.' 的段数。所以我们只要维护那两个东西

因为是单点修改,大力枚举四种情况即可

Ps:码力太弱,有些吃力

#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read()
{
ll s=;
bool f=;
char ch=' ';
while(!isdigit(ch))
{
f|=(ch=='-'); ch=getchar();
}
while(isdigit(ch))
{
s=(s<<)+(s<<)+(ch^); ch=getchar();
}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<)
{
putchar('-'); x=-x;
}
if(x<)
{
putchar(x+''); return;
}
write(x/);
putchar((x%)+'');
return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=;
int n,m;
char S[N];
int main()
{
int i,j,cnt=,Duans=;
R(n); R(m);
scanf("%s",S+);
for(i=;i<=n;i++) if(S[i]=='.') cnt++;
for(i=;i<=n;i++) if(S[i]=='.')
{
for(j=i;j<=n&&(S[j]=='.');j++);
Duans++;
i=j;
}
while(m--)
{
int Pos=read();
char SS[],ch;
scanf("%s",SS+); ch=SS[];
if(((S[Pos]=='.')||(ch=='.'))&&(S[Pos]!=ch))
{
if(S[Pos]=='.')
{
cnt--;
if(Pos>&&S[Pos-]=='.'&&Pos<n&&S[Pos+]=='.') Duans++;
if((Pos==||S[Pos-]!='.')&&(Pos==n||S[Pos+]!='.')) Duans--;
}
else
{
cnt++;
if(Pos>&&S[Pos-]=='.'&&Pos<n&&S[Pos+]=='.') Duans--;
if((Pos==||S[Pos-]!='.')&&(Pos==n||S[Pos+]!='.')) Duans++;
}
}
S[Pos]=ch;
// printf("cnt=%d Duans=%d\n",cnt,Duans);
Wl(cnt-Duans);
}
return ;
}
/*
input
10 3
.b..bz....
1 h
3 c
9 f
output
4
3
1 input
4 4
.cc.
2 .
3 .
2 a
1 a
output
1
3
1
1
*/

codeforces570C的更多相关文章

  1. Codeforces570C 【简单标记】

    题意: 给定一个长为n的字符串(包含小写字母和'.'),有m次操作 每次操作可以修改字符,并询问修改后有多少对相邻的'.' 思路: 标记. #include<bits/stdc++.h> ...

随机推荐

  1. LDAP2-创建OU创建用户

    创建OU创建用户 1.创建OU 选择Organisational unit 组织单元 输入OU名称 提交信息 结果创建成功 2.创建员工 选择ou选择新建子条目 选择默认模板 选择inetorgper ...

  2. 【原创】自己动手写一个能操作redis的客户端

    引言 redis大家在项目中经常会使用到.官网也提供了多语言的客户端供大家操作redis,如下图所示 但是,大家有思考过,这些语言操作redis背后的原理么?其实,某些大神会说 只要按照redis的协 ...

  3. 在GridControl控件上绑定图片的几种操作方式

    我们知道,基于DevExpress的开发Winform的项目界面的时候,GridControl控件是经常用来绑定数据的,一般以常规的字符内容为主,有时候也会有图片的显示需要,那么如果显示图片,我们应该 ...

  4. Python从菜鸟到高手(18):类与方法的私有化

    1. 创建自己的类 学习面向对象的第一步,就是创建一个类.因为类是面向对象的基石.Python类和其他编程语言(Java.C#等)的类差不多,也需要使用class关键字.下面通过一个实际的例子来看一下 ...

  5. 微信小程序页面跳转方法总结

    微信小程序页面跳转目前有以下方法(不全面的欢迎补充): 1. 利用小程序提供的 API 跳转: // 保留当前页面,跳转到应用内的某个页面,使用wx.navigateBack可以返回到原页面.// 注 ...

  6. JS判断当前设备类型

    CSS3出来后,我们一般都是通过@media媒体查询来实现网页自适应,但是有时候,还是需要我们根据不同的设备来对应的做不同的显示,这时候,我们需要知道当前用户访问我们的界面用的是什么设备,怎么获取呢? ...

  7. Leetcode 101. Symmetric Tree(easy)

    Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...

  8. Leetcode -- 258 数位相加

    258. Given a non-negative integer num, repeatedly add all its digits until the result has only one d ...

  9. mysql数据的导入和导出

    一. mysqldump工具基本用法,不适用于大数据备份   1. 备份所有数据库: mysqldump -u root -p --all-databases > all_database_sq ...

  10. vue-cli脚手架安装和webpack-simple模板项目生成

    vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目. GitHub地址是:https://github.com/vuejs/vue-cli 一. ...