码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #316 (Div. 2) C Replacement 扫描法

时间:2015-08-14 06:26:48      阅读:97      评论:0      收藏:0      [点我收藏+]

标签:

先扫描一遍得到每个位置向后连续的‘.‘的长度,包含自身,然后在扫一遍求出初始的合并次数。

对于询问,只要对应位置判断一下是不是‘.‘,以及周围的情况。

#include<bits/stdc++.h>
using namespace std;

const int maxn = 3e5+5;
char s[maxn];
int post[maxn];

int main()
{
    //freopen("in.txt","r",stdin);
    int n,m; scanf("%d%d",&n,&m); //getchar();
    scanf("%s",s);
    post[n-1] = s[n-1] == .;
    for(int i = n-2; i >= 0; i--){
        if(s[i] == .){
            post[i] = post[i+1]+1;
        }
    }
    int cnt = 0;
    for(int i = 0; i < n; i++){
        if(s[i] == .){
            cnt += post[i]-1;
            i += post[i];
        }
    }
    char ch[10];
    while(m--){
        int i;
        scanf("%d%s",&i,ch); i--;
        if(ch[0] == .){
            if(s[i] == .){
                printf("%d\n",cnt);
            }else {
                bool f1 = i>0 && s[i-1] == .;
                bool f2 = i+1<n && s[i+1] == .;
                cnt += f1+f2;
                printf("%d\n",cnt);
            }
        }else {
            if(s[i] == .){
                bool f1 = i>0 && s[i-1] == .;
                bool f2 = i+1<n && s[i+1] == .;
                cnt -= f1+f2;
                printf("%d\n",cnt);
            }else {
               printf("%d\n",cnt);
            }
        }
        s[i] = ch[0];
    }
    return 0;
}

 

Codeforces Round #316 (Div. 2) C Replacement 扫描法

标签:

原文地址:http://www.cnblogs.com/jerryRey/p/4728872.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!