Codeforces Round #316 (Div. 2) C. Replacement

题意:给定一个字符串,里面有各种小写字母和’ . ‘ ,无论是什么字母,都是一样的,假设遇到‘ . . ‘ ,就要合并成一个‘ .‘,有m个询问,每次都在字符串某个位置上将原来的字符改成题目给的字符,问每次须要多少次合并次数。才使字符串没有‘ .. ‘

思路:最原始的想法,就是对于每一次询问,都遍历整个字符串。这样时间复杂度o(n*m),就高达10^10方,非常明显会tle。

换下思路,事实上每次询问所改变的字符都会保留到下一次。也就是下一次的次数就会受到上一次的影响,那么我仅仅要就算出第一次的合并次数,以下的都能够推出来

题目链接:http://codeforces.com/problemset/problem/570/C

#include<bits/stdc++.h>
using namespace std;
int n,m,cnt;
char a[300005],b[10];
int main(void)
{
    scanf("%d%d",&n,&m);
    scanf("%s",a+1);
    scanf("%d%s",&cnt,b);
    a[cnt]=b[0];//处理第一次
    int ret,ans=0,flag;
    for(int i=1; i<=n; i++)
    {
        ret=0;
        flag=0;
        while(a[i]=='.')//假设一个子序列全都是'.',假设有ret个'.',那么合并次数就是ret-1;
        {
            i++;
            ret++;
            flag=1;
        }
        if(flag) ans+=ret-1;
    }
    printf("%d\n",ans);
    for(int i=1; i<m; i++)//处理剩余的m-1次,每一次的ans均由上一次推出
    {

        scanf("%d%s",&cnt,b);
        char ch=a[cnt];
        a[cnt]=b[0];
        if(b[0]=='.'&&ch!='.')//假设这一次由字母变成'.',检查前后是否有'.',有一个的话合并次数就要+1
        {
            if(a[cnt-1]=='.') ans++;
            if(a[cnt+1]=='.')  ans++;
        }
        else if(b[0]!='.'&&ch=='.')//由字母变成'.'
        {
            if(a[cnt-1]=='.') ans--;
            if(a[cnt+1]=='.')  ans--;
        }
        printf("%d\n",ans);
    }
    return 0;
}
时间: 2024-07-29 19:34:54

Codeforces Round #316 (Div. 2) C. Replacement的相关文章

Codeforces Round #316 (Div. 2)C. Replacement(模拟)

传送门 Description Daniel has a string s, consisting of lowercase English letters and period signs (characters '.'). Let's define the operation of replacement as the following sequence of steps: find a substring ".." (two consecutive periods) in st

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

先扫描一遍得到每个位置向后连续的'.'的长度,包含自身,然后在扫一遍求出初始的合并次数. 对于询问,只要对应位置判断一下是不是'.',以及周围的情况. #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; s

2017-4-30-Train:Codeforces Round #316 (Div. 2)

A. Elections(模拟) The country of Byalechinsk is running elections involving n candidates. The country consists of m cities. We know how many people in each city voted for each candidate. The electoral system in the country is pretty unusual. At the fi

Codeforces Round #316 (Div. 2) (ABC题)

A - Elections 题意: 每一场城市选举的结果,第一关键字是票数(降序),第二关键字是序号(升序),第一位获得胜利: 最后的选举结果,第一关键字是获胜城市数(降序),第二关键字是序号(升序),第一位获得胜利: 求最后选举获胜者. 思路: 直接模拟即可. 代码: /* * @author FreeWifi_novicer * language : C++/C */ #include<cstdio> #include<iostream> #include<cstring

Codeforces Round #316 (Div. 2) B. Simple Game

思路:把n分成[1,n/2],[n/2+1,n],假设m在左区间.a=m+1,假设m在右区间,a=m-1.可是我居然忘了处理1,1这个特殊数据.被人hack了. 总结:下次一定要注意了,提交前一定要看下边界数据,不要急着交. 题目链接:http://codeforces.com/problemset/problem/570/B <pre name="code" class="cpp">#include<bits/stdc++.h> using

Codeforces Round #316 (Div. 2) A B C

A. Elections time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output The country of Byalechinsk is running elections involving n candidates. The country consists of m cities. We know how many peopl

Codeforces Round #316 (Div. 2)

A - Elections 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m,num[105],a[105][105]; 4 int main() 5 { 6 scanf("%d%d",&n,&m); 7 for(int i=1;i<=m;i++) 8 { 9 int item=1; 10 for(int j=1;j<=n;j++) 11 { 12 scanf("%d&

Codeforces Round #316 (Div. 2) D计算在一棵子树内某高度的节点

题:https://codeforces.com/contest/570/problem/D 题意:给定一个以11为根的n个节点的树,每个点上有一个字母(a~z),每个点的深度定义为该节点到11号节点路径上的点数.每次询问a,ba,b查询以aa为根的子树内深度为bb的节点上的字母重新排列之后是否能构成回文串.分析:很明显是个树上启发式合并.显然,只要深度为bb结点的所有颜色中,至多有一种的数量为奇数就可以构成回文串了. #include<bits/stdc++.h> using namespa

Codeforces Round #316 (Div. 2) A

Description The country of Byalechinsk is running elections involving n candidates. The country consists of m cities. We know how many people in each city voted for each candidate. The electoral system in the country is pretty unusual. At the first s