#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn = 3e5 + 5;
int n, m;
char str[maxn];
char letter;
int site;
int cnt, step;
int main()
{
while(~scanf("%d %d", & n, & m))
{
scanf("%s", str);
str[n] = 'X';
cnt = step = 0;
for(int i = 0; i <= n; i ++)
{
if(str[i] == '.')
cnt ++;
else
{
if(cnt > 0)
{
step += cnt - 1;
cnt = 0;
}
}
}
for(int i = 1; i <= m; i ++)
{
scanf("%d %c", & site, & letter);
if(letter == '.' && str[site - 1] != '.')
{
if(str[site - 1 - 1] == '.' && str[site - 1 + 1] != '.')
step ++;
else if(str[site - 1 - 1] != '.' && str[site - 1 + 1] == '.')
step ++;
else if(str[site - 1 - 1] == '.' && str[site - 1 + 1] == '.')
step += 2;
}
else if(letter != '.' && str[site - 1] == '.')
{
if(str[site - 1 - 1] == '.' && str[site - 1 + 1] == '.')
step -= 2;
else if(str[site - 1 - 1] == '.' && str[site - 1 + 1] != '.')
step --;
else if(str[site - 1 - 1] != '.' && str[site - 1 + 1] == '.')
step --;
}
str[site - 1] = letter;
printf("%d\n", step);
}
}
}
题意:遇到两个'.'就变成一个。问需要的步数。第一行输入n表示字符串的长度。输入m表示替换次数。第二行输入字符串。接下来的m行输入 要替换的序号 和 替换的字符。问每变换一遍输出变句号的步数。
题解:直接暴力肯定不行的,,,肯定超时..不能看是c题而想太麻烦..以上代码是很简单的操作。不需要什么线段树,树状数组。只要判断改变的字符前后的字符是什么,再在原步数改变1 或者 2就可以。