首页 > 其他分享 >洛谷题单指南-递推与递归-P3612 [USACO17JAN] Secret Cow Code S

洛谷题单指南-递推与递归-P3612 [USACO17JAN] Secret Cow Code S

时间:2024-02-20 11:02:08浏览次数:31  
标签:Code Cow 洛谷题 long len 字符串 长度 加长 个字符

原题链接:https://www.luogu.com.cn/problem/P3612

题意解读:字符串加长的时候,是先把最后一个字符接上,再拼接其余字符,注意不是翻转,要找第n个字符,就要看字符串加长几次后长度能超过n,

然后在加长后的字符串中找第n个字符。

解题思路:

如果直接通过模拟法,字符串长度太长,且要找的第n个数值也太大,空间和时间都吃不消。

可以设定计算字符串加长k倍之后,长度为l时,可以找到第n个字符

如果n <= l / 2,说明在加长k倍的字符串前一半中就可以找到第n个字符,即在加长k-1倍的字符串中找第n个字符

如果n > l / 2,说明要在加长k倍的字符串后一半中才能找到第n个字符,而后一半和前一半的区别就在于后一半的第一个字符是前一半的最后一个字符

这样以来,在k倍长字符串中找第n个字符,就可以转化为在k-1倍长字符串中找第x个字符,x根据上述规则来计算

整个过程可以通过递归来实现。

100分代码:

#include <bits/stdc++.h>
using namespace std;

string s;
long long n;

//在长度是k倍原始长度、k倍后长度是l的字符串中,找第x个字符
char find(int k, long long l, long long x)
{
    if(k == 1) 
    {
        return s[x - 1];
    }
    if(x <= l / 2) return find(k - 1, l / 2, x); //如果x在l / 2范围内,则直接在k-1倍的字符串中找第x个字符
    else //否则x在两个k-1倍的字符串中
    {
        x = x -  l / 2; //在第二个k-1倍字符串中的位置
        if(x == 1) x = l / 2; //映射到第一个k-1倍字符串的位置,如果x % (l / 2)是1,表示对应最后一个字符
        else x = x - 1; //否则表示对应到第一个k-1倍字符串的第x % (l / 2) - 1个字符
        return find(k - 1, l / 2, x);
    }
}

int main()
{
    cin >> s >> n;
    long long len = s.length();
    int k = 1;
    while(len < n) //计算字符串加长k倍后,长度为len时可以找到第n个字符
    {
        len *= 2;
        k++;
    } 
    cout << find(k, len, n);
    return 0;
}

 

标签:Code,Cow,洛谷题,long,len,字符串,长度,加长,个字符
From: https://www.cnblogs.com/jcwy/p/18022623

相关文章

  • Codeforces Round 928 (Div. 4)
    总结一下最近:感觉过于追求进度了,没有好好的把每题都吃透消化,然后有点依赖题解了,没有好好的思考...B.VladandShapesB题输入二维数组的时候不可以直接两个for循环然后cin,要读入char,再转为数字赋值给二维数组,因为他读入的时候不带有空格而int是要有空格的,这样子比如读000就把它......
  • Codeforces Round 924 (Div. 2)
    目录写在前面ABCDEF写在最后写在前面比赛地址:https://codeforces.com/contest/1928。终于把欠下的一堆题补上了呃呃天使骚骚共通线什么构式呃呃,一周目就想走老师线直通单身笑死我了。A签到。发现等分后重新拼接可以得到\(\frac{x}{2}\times2y\)与\(\frac{y}{2}\times2......
  • Codeforces Round 927 (Div. 3)(A~F)
    目录ABCDEFA第一个遇到连续两个荆棘的地方就不能再赢金币了。所以统计连续两个荆棘之前的所有金币#include<bits/stdc++.h>#defineintlonglong#definerep(i,a,b)for(inti=(a);i<=(b);++i)#definefep(i,a,b)for(inti=(a);i>=(b);--i)#definepiipai......
  • Leetcode 21-25题
    合并两个有序链表将两个升序链表合并为一个新的升序链表。用两个指针指向两个链表的表头,然后每次比较一下哪个值小,将较小的节点接到答案后面即可。ListNode*mergeTwoLists(ListNode*list1,ListNode*list2){autodummy=newListNode(),p=dummy;autol1=......
  • 【Azure Function App】在VS Code中,创建好Function App后部署到Azure中,无法选择Subscr
    问题描述在VSCode中,创建好FunctionApp后部署到Azure中,无法选择Subscriptions问题解答对于无法使用VSCode 部署FunctionApp 到Azure,最近有一个更新,导致了AzureResource 插件的 v0.8.0 版本不支持中国区登录目前的解决办法是:通过手动安装的方式把VSCode中的Azu......
  • Codeforces Round 927 (Div. 3)
    CodeforcesRound927(Div.3)A-ThornsandCoins解题思路:出现连续两个障碍之前,所有金币都能拿到。代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecondusingi128=__int128_t;......
  • 使用VS Code Remote SSH连接上服务器实现远程开发
    1下载VSCODE,Windows版本https://code.visualstudio.com/updates/v1_852安装插件3 配置SSH密钥,上传公钥到服务器4连接成功,直接操作远程目录和文件   远程开发https://code.visualstudio.com/docs/remote/remote-overview https://www.jianshu.com/p/37bbec3788......
  • Codeforces Round 927 (Div. 3)
    CodeforcesRound927(Div.3)C.LR-remaindersDescription给定一个长度为\(n\)的数组\(a\)和\(n\)个指令,每条指令为\(\texttt{L,R}\)中的一种。依次处理每个指令:首先,输出\(a\)中所有元素的乘积除以\(m\)的余数。然后,如果当前指令为\(\textttL\),则移除数组......
  • 洛谷题单指南-递推与递归-P1990 覆盖墙壁
    原题链接:https://www.luogu.com.cn/problem/P1990题意解读:用两种可旋转的形状铺满N*2的区域,求方案数,可以使用递推。解题思路:步骤1、设f[i]表示铺满i*2的区域的方案数根据要求,i*2区域最后一列有4种可能的铺法:如果采用图1铺法,则有f[i]=f[i-1]如果采用图2铺法,则有f[i]=f......
  • code: 'ERR_OSSL_EVP_UNSUPPORTED' 报错解决
    报错:Error:error:0308010C:digitalenveloperoutines::unsupportedatnewHash(node:internal/crypto/hash:69:19)atObject.createHash(node:crypto:133:10)atBulkUpdateDecorator.hashFactory(D:\WzProject\wz-middle-ground-frontend\node_module......