codeforces570C
Replacement
话说很久很久以前,孙悟空被压在了山下,很无聊。于是他找了一个只包含小写字母和字符"." 的字符串。 由于他比较无聊,他就开始了换点点,他找到字符串中第一个出现的"..",然后把其换成"."。 如果字符串中不包含"..",换点点操作对字符串无效
现在定义一个值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 ≤ n, ci — 一个小写字母或一个字符".")
Output
输出m个数字,每个一行 ,输出执行第i个替换后的f(s)值。
Example
10 3
.b..bz....
1 h
3 c
9 f
4
3
1
4 4
.cc.
2 .
3 .
2 a
1 a
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的更多相关文章
- Codeforces570C 【简单标记】
题意: 给定一个长为n的字符串(包含小写字母和'.'),有m次操作 每次操作可以修改字符,并询问修改后有多少对相邻的'.' 思路: 标记. #include<bits/stdc++.h> ...
随机推荐
- mysql存储引擎之MyISAM 和 InnoDB的比较
一.什么是存储引擎 存储引擎说白了就是如何存储数据.如何为存储的数据建立索引和如何更新.查询数据等技术的实现方法.因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和 ...
- Dapper简易教程(翻译自Github上StackExchange/Dapper)
本文源自:https://github.com/cnxy/Dapper-zh-cn 本博客作者与Github上作者(cnxy)实为同一个作者.由于笔者翻译水平有限,文本中错误难免,欢迎指正! 本文翻译 ...
- 朱晔和你聊Spring系列S1E9:聊聊Spring的那些注解
本文我们来梳理一下Spring的那些注解,如下图所示,大概从几方面列出了Spring的一些注解: 如果此图看不清楚也没事,请运行下面的代码输出所有的结果. Spring目前的趋势是使用注解结合Java ...
- 朱晔的互联网架构实践心得S1E6:给飞机换引擎和安全意识十原则
朱晔的互联网架构实践心得S1E6:给飞机换引擎和安全意识十原则 [下载本文PDF进行阅读] 本文有两个部分,先介绍一下给飞机换引擎这个事情我的一些经验,因为篇幅较短然后介绍一下安全意识方面的一些心得. ...
- 04 Docker/基础设施 - DevOps之路
04 Docker/基础设施 - DevOps之路 文章Github地址,欢迎start:https://github.com/li-keli/DevOps-WiKi Docker是一个开源的引擎,可 ...
- Php7 开发笔记
Ubuntu环境安装 http://www.jianshu.com/p/1d312d9f1be1 sudo apt-get install python-software-properties sof ...
- js canvas图片压缩
function preview_picture(pic){ var r=new FileReader(); r.readAsDataURL(pic); r.onload=function(e){ d ...
- C#中委托,匿名函数,lamda表达式复习
一.委托 1.就给类比较,类用class声明,委托用delegate声明. 2.委托要指向一个真正的方法. 3.委托的签名,要和指向的方法一样. //1.声明一个委托 public delegate ...
- Leetcode 665. Non-decreasing Array(Easy)
Given an array with n integers, your task is to check if it could become non-decreasing by modifying ...
- scrapy之持久化存储
scrapy之持久化存储 scrapy持久化存储一般有三种,分别是基于终端指令保存到磁盘本地,存储到MySQL,以及存储到Redis. 基于终端指令的持久化存储 scrapy crawl xxoo - ...