返回顶部

Secret Cow Code S

这道题的主要思路就是对生成的字符串进行化简。

模拟完成后string字符存不下,会爆。

所以我们用化简的思路,从几个方面考虑:

  • 每个新字符串的第一个字符是原有字符串的最后一个字符

  • 其他字符都是-1照搬

  • 每一个新字符串的最后一个字符都是原有字符串的最后一个字符的前一个字符

可得:

  • n /= 2

  • n = n - l - 1

  • n = l

递归条件:

  • n 不小于大于原字符串长度即截止
#include <bits/stdc++.h>
using namespace std;
string s;
long long n;
long long l;
int main()
{
    cin >> s >> n;
    l = s.size(); // 获得长度
    long long a = l; // 原字符串长度
    while (l < n)
        l = l * 2;
    l = l / 2;
    while (n > a) // 只有一个字符就直接输出
    {
        if (n == l)
            n = n / 2;
        else if (n - l > 1)
            n = n - l - 1; // 递归回上一个字符串

        else if (n - l == 1) // 第一个
            n = l;

        l /= 2; // 切一半

    }
    printf("%c", s[n - 1]);
    return 0;
}

感觉用循环来递归好理解。。。个人原因吧~

首发于:https://www.luogu.com.cn/blog/zrc4889/

posted @ 2022-01-08 22:25  zrc4889  阅读(52)  评论(0编辑  收藏  举报