您的位置:首页 > 其它

CodeForces-570C Replacement

2015-08-14 16:12 267 查看
#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
= '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就可以。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: