题目链接:Click here
题意:给定一个字符串,由‘.’和字母组成。把两个相邻的‘.’替换成一个‘.’,算一次变换。现在给你一些个操作,操作内容是把某个位置的字符变成给定的字符,求每次操作后,需要多少次变换才能把原串所有相邻的‘.’变成一个‘.’。注意,每次操作是累加的,即一次操作就会把原串替换一个字符。
思路:先计算原串变换所需要的次数。每次操作判断要改变的符号的左右,如果该符号原来是’.’的话,如果左面是’.’,ans减一,如果右边是’.’,ans减一,同理如果该符号是字母的话,左或右是’.’,ans加一
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
char a[300005];
int main()
{
int m, n, ans, x;
char s[2];
while(scanf("%d%d", &m, &n) != EOF)
{
getchar();
gets(a);
ans = 0;
for(int i = 1; i < m; i++)
if(a[i] == '.' && a[i-1] == '.')
ans++;
for(int i = 0; i < n; i++)
{
scanf("%d%s", &x, s);
x--; //因为标号是从0开始的
if(a[x] == '.' && s[0] != '.')
{
if(a[x-1] == '.')
ans--;
if(a[x+1] == '.')
ans--;
}
if(a[x] !='.' && s[0] == '.')
{
if(a[x-1] == '.')
ans++;
if(a[x+1] == '.')
ans++;
}
a[x] = s[0];
printf("%d\n", ans);
}
}
return 0;
}