Codeforces Round #719 (Div. 3)-E. Arranging The Sheep-前后缀

Posted Chivas_/Regal

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #719 (Div. 3)-E. Arranging The Sheep-前后缀相关的知识,希望对你有一定的参考价值。

题目:
在这里插入图片描述

分析:
既然每个星星都要聚成一堆
那么必定是前面的向后走
后面的向前走
不知道都走到哪才能得出结果
于是每个位置扫一遍就行了

思路:
开一个前缀一个后缀
分别表示前面的星星全聚到某个位置时需要几步
和后面的星星全聚到某个位置时需要几步
然后枚举每个空位置
维护一下最小值
缀的计算方式:如果当前位置是’.’,那么这个位置的值就是上一个位置的值+之前的星星个数。如果当前位置是’*’,那么这个位置的值就是上一个位置的值,且星星个数++

代码:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <cstdio>
#include <stack>
#include <queue>
#include <cmath>
#include <map>
#include <set>
#define G 10.0
#define LNF 1e18
#define eps 1e-6
#define PI acos(-1.0)
#define ll long long
#define INF 0x7FFFFFFF
#define Regal exit(0)
#define Chivas int main()
#define pb(x) push_back(x)
#define SP system("pause")
#define ull unsigned long long
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define IOS ios::sync_with_stdio(false)
#define MEM(a, b) memset(a, b, sizeof(a))
#define each_cass(cass) for (cin >> cass; cass; cass--)
#define test(a) cout << "---------" << a << "---------" << '\\n'
 
using namespace std;
 
inline void solve(){
    ll n;
    string s;

    cin >> n;
    cin >> s;

    ll fro[s.size() +10]={0};
    ll enn[s.size() + 10] = {0};

    ll cnt = 0;//走前缀
    for(ll i = 0; i < n; i++){
        if(i==0){
            fro[i] = 0;
            cnt += (s[i] == '*');//初位置一定是0,但是判断是否有星星
            continue;
        }
        if(s[i] == '*') cnt++, fro[i] = fro[i - 1];
        else fro[i] = fro[i - 1] + cnt;//全体星星向右移动一格
    }
    
    cnt = 0;//走后缀
    for(ll i = n - 1; i >= 0; i --){
        if(i == n - 1){
            enn[i] = 0;
            cnt += (s[i] == '*');//初位置一定是0,但是判断是否有星星
            continue;
        }
        if(s[i] == '*') cnt ++, enn[i] = enn[i + 1];//全体星星向左移动一格
        else enn[i] = enn[i + 1] + cnt;
    }

    ll res = LNF;
    for(ll i = 0; i < n; i ++){//枚举每个'.'的位置
        if(s[i] == '.'){
            if(i > 0) res = min(res, fro[i - 1] + enn[i]);
            if(i < n - 1) res = min(res, fro[i] + enn[i + 1]);
        }
    }
    if(res == LNF) res = 0;
    cout << res << endl;
}
 
Chivas{
    IOS;
    int cass;
    each_cass(cass){
        solve();
    }
    Regal;
}

以上是关于Codeforces Round #719 (Div. 3)-E. Arranging The Sheep-前后缀的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #719 (Div. 3)Codeforces-1520ABCDE

Codeforces Round #719 (Div. 3) ABCDEF题解

Codeforces Round #719 (Div. 3) A-E

Codeforces Round #719 (Div. 3) A-G题解 G题详细注释

Codeforces Round #719 (Div. 3) A-G题解 G题详细注释

Codeforces Round #719 (Div. 3) A-G题解 G题详细注释