牛客月赛49思维f

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

如果你厌倦了长文题意,可以参考下面的伪代码理解题意。

你有一个数组 fa[i]fa[i]fa[i] 表示结点 iii 的父亲结点编号,初始 fa[2]=fa[3]=1fa[2]=fa[3]=1fa[2]=fa[3]=1;另有一个数组 tp[i]tp[i]tp[i] 表示结点 iii 的属性(左孩子结点还是右孩子结点)。初始 tp[2]=′L′tp[2]=\tt{'L'}tp[2]=′L′,tp[3]=′R′tp[3]=\tt{'R'}tp[3]=′R′。


即初始的树如右图所示:



接下来给出一个操作序列 strstrstr,其中会包含三种字符 L, R, M\tt L,~R,~ML, R, M:
 

  1. L\tt LL 操作:对所有上一轮新生成的结点中(初始新生成的结点是 2,32,32,3)所有 tp[i]=′L′tp[i]=\tt{'L'}tp[i]=′L′(左孩子)的结点,生成两个孩子结点,一个左孩子一个右孩子。

  1. R\tt RR 操作:对所有上一轮新生成的结点中(初始新生成的结点是 2,32,32,3)所有 tp[i]=′R′tp[i]=\tt{'R'}tp[i]=′R′ (右孩子)的结点,生成两个孩子结点,一个左孩子一个右孩子。

  1. M\tt MM 操作:对所有上一轮新生成的结点中(初始新生成的结点是 2,32,32,3)所有的结点(不论属性),生成两个孩子结点,一个左孩子一个右孩子。


最终求执行完 kkk 次操作序列 strstrstr 后(可以理解成将序列 strstrstr 复制成原来的 kkk 倍并依次执行)树的直径长度(树上一条链包含最多结点个数)是多少。

如果你厌倦了长文题意,可以参考下面的伪代码理解题意:

代码中 Tree_Diametre(fa)\rm Tree\_Diametre(fa)Tree_Diametre(fa) 表示利用 fa\rm fafa 数组求树的直径。

输入描述:

 

全文第一行输入一行一个正整数 T(1≤T≤105)T(1\le T\le10^5)T(1≤T≤105),表示数据组数。


接下来对每组数据,第一行输入两个正整数 n,k(1≤n≤105,∑n≤3×106,1≤k≤109)n,k(1\le n\le10^5,\sum n\le3\times10^6,1\le k\le10^9)n,k(1≤n≤105,∑n≤3×106,1≤k≤109),分别表示 strstrstr 的长度和操作次数。

第二行输入这个长度为 nnn 的操作序列 strstrstr,由 nnn 个仅可能为 L\tt LL、R\tt RR、M\tt MM 的大写英文字母组成。

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long ll;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,k;
        scanf("%d%d",&n,&k);
        char str[n+1];
        scanf("%s",str);
        ll pos=(ll)k*n+1;
        for(int i=0;str[i];i++)
        {
            if(str[i]=='M')
            {
                pos=i;
                break;
            }
        }
        ll len=(ll)k*n-pos+1;
        ll ans=(ll)k*n+2;
        ans=max(ans,len*2);
        printf("%lld\n",ans+1);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值