博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces Round #316 (Div. 2)C. Replacement(模拟)
阅读量:4708 次
发布时间:2019-06-10

本文共 3920 字,大约阅读时间需要 13 分钟。

Description

Daniel has a string s, consisting of lowercase English letters and period signs (characters '.'). Let's define the operation of replacement as the following sequence of steps: find a substring ".." (two consecutive periods) in string s, of all occurrences of the substring let's choose the first one, and replace this substring with string ".". In other words, during the replacement operation, the first two consecutive periods are replaced by one. If string s contains no two consecutive periods, then nothing happens.

Let's define f(s) as the minimum number of operations of replacement to perform, so that the string does not have any two consecutive periods left.

You need to process m queries, the i-th results in that the character at position xi (1 ≤ xi ≤ n) of string s is assigned value ci. After each operation you have to calculate and output the value of f(s).

Help Daniel to process all queries.

Input

The first line contains two integers n and m (1 ≤ n, m ≤ 300 000) the length of the string and the number of queries.

The second line contains string s, consisting of n lowercase English letters and period signs.

The following m lines contain the descriptions of queries. The i-th line contains integer xi and ci (1 ≤ xi ≤ nci — a lowercas English letter or a period sign), describing the query of assigning symbol ci to position xi.

Output

Print m numbers, one per line, the i-th of these numbers must be equal to the value of f(s) after performing the i-th assignment.

Sample Input

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

Sample Output

4 3 1
 
1 3 1 1

Note

Note to the first sample test (replaced periods are enclosed in square brackets).

The original string is ".b..bz....".

  • after the first query f(hb..bz....) = 4    ("hb[..]bz...."  →  "hb.bz[..].."  →  "hb.bz[..]."  →  "hb.bz[..]"  → "hb.bz.")
  • after the second query f(hbс.bz....) = 3    ("hbс.bz[..].."  →  "hbс.bz[..]."  →  "hbс.bz[..]"  →  "hbс.bz.")
  • after the third query f(hbс.bz..f.) = 1    ("hbс.bz[..]f."  →  "hbс.bz.f.")

Note to the second sample test.

The original string is ".cc.".

  • after the first query: f(..c.) = 1    ("[..]c."  →  ".c.")
  • after the second query: f(....) = 3    ("[..].."  →  "[..]."  →  "[..]"  →  ".")
  • after the third query: f(.a..) = 1    (".a[..]"  →  ".a.")
  • after the fourth query: f(aa..) = 1    ("aa[..]"  →  "aa.")

思路

题解:

暴力肯定超时,注意到f(s)的值为“点数-段数”,预处理出第一次的点数与段数,然后在每次更改中,更新点数与段数的值即可。简单模拟。

 

#include
using namespace std;const int maxn = 300005;char str[maxn];int main(){ //freopen("input.txt","r",stdin); int n,m,pos,dot = 0,segment = 0; char ch; scanf("%d%d",&n,&m); scanf("%s",str); for (int i = 0;i < n;i++) { if (str[i] == '.') dot++; if (str[i] == '.' && (!i || str[i-1] != '.')) segment++; } for (int i = 0;i < m;i++) { scanf("%d %c",&pos,&ch); pos--; if (ch != '.') { if (str[pos] == '.') { dot--; if (!pos && str[pos + 1] != '.') segment--; else if (pos == n - 1 && str[pos - 1] != '.') segment--; else if (pos && pos < n - 1 && str[pos - 1] == '.' && str[pos + 1] == '.') segment++; else if (pos && pos < n - 1 && str[pos - 1] != '.' && str[pos + 1] != '.') segment--; } str[pos] = ch; } else { if (str[pos] != '.') { dot++; if (!pos && str[pos + 1] != '.') segment++; else if (pos == n - 1 && str[pos - 1] != '.') segment++; else if (pos && pos < n - 1 && str[pos - 1] == '.' && str[pos + 1] == '.') segment--; else if (pos && pos < n - 1 && str[pos - 1] != '.' && str[pos + 1] != '.') segment++; } str[pos] = ch; } printf("%d\n",dot - segment); } return 0;}

  

转载于:https://www.cnblogs.com/ZhaoxiCheung/p/6786648.html

你可能感兴趣的文章
MySQL对于有大量重复数据表的处理方法
查看>>
Android应用开发学习笔记之多线程与Handler消息处理机制
查看>>
ubuntu 设置环境变量
查看>>
jquery之别踩白块游戏的实现
查看>>
索引的分类--B-Tree索引和Hash索引
查看>>
Python学习笔记——参数axis=0,1,2...
查看>>
kivy学习三:打包成window可执行文件
查看>>
兄弟连PHP培训教你提升效率的20个要点
查看>>
【快报】基于K2 BPM的新一代协同办公门户实践交流会
查看>>
关于MySQL的行转列的简单应用
查看>>
Queue 队列的用法
查看>>
CDM常用命令
查看>>
游戏开发中常用的设计模式
查看>>
Linux 中/etc/profile、~/.bash_profile 环境变量配置及执行过程
查看>>
JAVA:图形之利用FontMetrics类居中
查看>>
使用rsync同步目录
查看>>
[读码时间] for循环遍历设置所有DIV块元素背景色为红色
查看>>
网页调用迅雷下载文件
查看>>
Python 调用 Shell命令
查看>>
POJ 1159 Palindrome(最长公共子序列)
查看>>