Replacement
题目链接:
http://codeforces.com/problemset/problem/570/C
解题思路:
Lets find how replacements occur. If we have segment of points with length l,we need l-1 operations and stop replacements for this segment. If we sum lenghts of all segments and its quantity then answer will be = total length of segments — quantity of segments. After change of one symbol length changes by 1.
Quantity of segments can be supported by array. Consider events of merging, dividing,creation and deletion of segments. For merging we need to find if both of neighbors(right and left) are points then merging occured and quantity of segments reduced by 1. Other cases can be cosidered similarly.
O(n + m)
心塞,比赛的时候在处理用‘.’别的字符时,忘考虑替换‘.’时,价值并不变,还好wrong了几次,及时发现了这个错误。。。AC代码:
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
int main(){
int n,m;
while(~scanf("%d%d",&n,&m)){
string str;
cin>>str;
int sum = 0,l = str.size();
for(int i = 0; i < l-1; i++){
if(str[i] == '.' && str[i+1] == '.')
sum++;
}
int x;
char c;
for(int i = 0; i < m; i++){
cin>>x>>c;
x--;
if(c != '.'){
if(x-1 >= 0 && str[x] == '.' && str[x-1] == '.')
sum--;
if(x+1 < l && str[x] == '.' && str[x+1] == '.')
sum--;
str[x] = c;
}
else if(str[x] != '.'){
str[x] = c;
if(x-1 >= 0 && str[x] == '.' && str[x-1] == '.')
sum++;
if(x+1 < l && str[x] == '.' && str[x+1] == '.')
sum++;
}
//cout<<str<<endl;
printf("%d\n",sum);
}
}
return 0;
}