Educational Codeforces Round 103 (Rated for Div. 2) D. Journey(思维)

传送门


题目大意

给出 n n n个字符,节点编号为 [ 0 , n ] [0,n] [0,n],第 i i i个字符若为 L L L代表节点 i i i到节点 i − 1 i-1 i1有一条有向边,否则代表节点 i − 1 → i i-1 \rightarrow i i1i有一条有向边。如果从一个点走到另外一个点,那么所有边的方向会立刻反向。分别输出从每个节点出发能经历的所有节点个数。

解题思路

首先手玩一下样例,不难发现如果一个点可以向某个方向不断走,那么那个方向的 L R LR LR一定是交替出现的!而且走到终点一定可以原路返回,这启发我们,只要能预处理出每个节点向左和向右能走的最大距离,只需要顺序枚举相邻两字符是否相等然后同理逆序枚举。

但是本题容易把人搞晕,就是不能把每个点本身算进去,因为 L , R L,R L,R这些标记是在相邻两点的边上的。还有就是注意首尾节点特殊处理一下。


//
// Created by Happig on 2021/1/30.
//
#include <bits/stdc++.h>
#include <unordered_map>

using namespace std;
#define ENDL "\n"
#define lowbit(x) (x & (-x))
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<double, double> pdd;
const double eps = 1e-8;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const double dinf = 1e300;
const ll INF = 1e18;
const int Mod = 998244353;
const int maxn = 3e5 + 10;

int L[maxn], R[maxn];

int main() {
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int t, n;
    string s;
    cin >> t;
    while (t--) {
        cin >> n;
        cin >> s;
        string res = "";
        res += s[0], res += s, res += s[n - 1];
        s = res;
        for (int i = 1; i <= n; i++) {
            if (s[i] != s[i - 1]) L[i] = L[i - 1] + 1;
            else L[i] = 1;
        }
        for (int i = n; i >= 1; i--) {
            if (s[i] != s[i + 1]) R[i] = R[i + 1] + 1;
            else R[i] = 1;
        }
//        for (int i = 1; i <= n; i++) cout << L[i] << " ";
//        cout << ENDL;
//        for (int i = 1; i <= n; i++) cout << R[i] << " ";
//        cout << ENDL;
        cout << (s[0] == 'L' ? 1 : R[1] + 1) << " ";
        for (int i = 1; i < n; i++) {
            int ans = 1;
            if (s[i] == 'L') ans += L[i];
            if (s[i + 1] == 'R') ans += R[i + 1];
            cout << ans << " ";
        }
        cout << (s[n] == 'R' ? 1 : L[n] + 1) << ENDL;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"educational codeforces round 103 (rated for div. 2)"是一个Codeforces平台上的教育性比赛,专为2级选手设计评级。以下是有关该比赛的回答。 "educational codeforces round 103 (rated for div. 2)"是一场Codeforces平台上的教育性比赛。Codeforces是一个为程序员提供竞赛和评级的在线平台。这场比赛是专为2级选手设计的,这意味着它适合那些在算法和数据结构方面已经积累了一定经验的选手参与。 与其他Codeforces比赛一样,这场比赛将由多个问题组成,选手需要根据给定的问题描述和测试用例,编写程序来解决这些问题。比赛的时限通常有两到三个小时,选手需要在规定的时间内提交他们的解答。他们的程序将在Codeforces的在线评测系统上运行,并根据程序的正确性和效率进行评分。 该比赛被称为"educational",意味着比赛的目的是教育性的,而不是针对专业的竞争性。这种教育性比赛为选手提供了一个学习和提高他们编程技能的机会。即使选手没有在比赛中获得很高的排名,他们也可以从其他选手的解决方案中学习,并通过参与讨论获得更多的知识。 参加"educational codeforces round 103 (rated for div. 2)"对于2级选手来说是很有意义的。他们可以通过解决难度适中的问题来测试和巩固他们的算法和编程技巧。另外,这种比赛对于提高解决问题能力,锻炼思维和提高团队合作能力也是非常有帮助的。 总的来说,"educational codeforces round 103 (rated for div. 2)"是一场为2级选手设计的教育性比赛,旨在提高他们的编程技能和算法能力。参与这样的比赛可以为选手提供学习和进步的机会,同时也促进了编程社区的交流与合作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值