Codeforces Round #316 (Div. 2) C. Replacement

来源:互联网 发布:网络电影播放器 编辑:程序博客网 时间:2024/05/22 00:17
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Daniel has a string s, consisting of lowercase English letters and period signs (characters '.'). Let's define the operation of replacementas 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 test(s)
input
10 3.b..bz....1 h3 c9 f
output
431
input
4 4.cc.2 .3 .2 a1 a
output
1311
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.")

这道题的意思是,给你一个n个长度的字符串,然后有m个操作,每个操作之后,都对字符串进行删点的操作,就像note提示的那样操作,但是在每次进行操作的时候,操作的对象是把字符串替换之后的字符串,而不是删点操作之后的字符串,问,每次替换掉字符串中的某个元素之后,删点的操作要做多少次。

首先计算出还没有操作的时候原字符串的删点操作需要多少步,然后再进行操作,如果一个点临近的两个都是点,那么就要进行两次,如果只有一个是点,那么只需要进行一次操作,那么如果在原字符串中用字母替代字母或者用点替换点,显然对后面的删点操作不造成影响,因此只要考虑把点替换成字母或者把字母替换成点这两种情况就行了,替换后再判断替换的位置两边是否存在点,然后再考虑操作步数是少了还是多了。

#include<iostream>#include<string.h>#include<stdio.h>using namespace std;char str[300010];int main(){int n,m;scanf("%d %d",&n,&m);scanf("%s",str);int ans=0;for(int i=0;i<n;i++){if(str[i]=='.'&&str[i+1]=='.')  ans++;}int oper=0;char a;for(int i=0;i<m;i++){scanf("%d",&oper);getchar();scanf("%c",&a);oper--;if(str[oper]<='z'&&str[oper]>='a'&&a=='.'){if(str[oper-1]=='.')  ans++;if(str[oper+1]=='.')  ans++;str[oper]=a;}if(str[oper]=='.'&&a<='z'&&a>='a'){if(str[oper-1]=='.')  ans--;if(str[oper+1]=='.')  ans--;str[oper]=a;}printf("%d\n",ans);}return 0;}


0 0
原创粉丝点击