首页 > 其他分享 >洛谷P3612 [USACO17JAN] Secret Cow Code S

洛谷P3612 [USACO17JAN] Secret Cow Code S

时间:2023-09-25 18:34:29浏览次数:38  
标签:字符 Code 洛谷 Cow long 旋转 Solve 字符串 include

[USACO17JAN] Secret Cow Code S

题面翻译

奶牛正在试验秘密代码,并设计了一种方法来创建一个无限长的字符串作为其代码的一部分使用。

给定一个字符串,让后面的字符旋转一次(每一次正确的旋转,最后一个字符都会成为新的第一个字符)。也就是说,给定一个初始字符串,之后的每一步都会增加当前字符串的长度。

给定初始字符串和索引,请帮助奶牛计算无限字符串中位置 \(N\) 的字符。

第一行输入一个字符串。该字符串包含最多 \(30\) 个大写字母,数据保证 \(N \leq 10^{18}\) 。

第二行输入 \(N\)。请注意,数据可能很大,放进一个标准的 \(32\) 位整数可能不够,所以你可能要使用一个 \(64\) 位的整数类型(例如,在 C/C++ 中是 long long)。

请输出从初始字符串生成的无限字符串中的位置的字符。第一个字符是 \(N=1\).。

样例 #1

样例输入 #1

COW 8

样例输出 #1

C

提示

In this example, the initial string COW expands as follows:

COW -> COWWCO -> COWWCOOCOWWC

以上为题目。
这道题题目描述很简单,就是将一个字符串的最后一个字符当作第一个字符,然后将剩下的字符复制下来。

有一个很朴素的想法,那就是模拟题目中所描述的字符串旋转的过程,创造一个长度大于N的字符串,最后直接输出Arr[N-1]即可,代码如下

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
long long N = 0;
string S;
void Solve(string& s)
{
	if (s.size() >= N)
	{
		return;
	}	
	int len = s.size() - 1;
	s.push_back(s[s.size() - 1]);
	for (int i = 0; i < len; i++)
	{
		s.push_back(s[i]);
	}
	Solve(s);
}
int main()
{
	cin >> S >> N;
	Solve(S);
	cout << S[N-1];
	return 0;
}

可想而知,如果N足够大,字符串的长度也会惊人的大,最后导致MLE。

因此,我们要想一种方法,不用真正的模拟出旋转后的字符串,而是仅通过递推来找出目标字符在未旋转字符串中的位置

不如假设经过多次旋转操作后的字符串长度为2*N

根据题目描述,则此字符串的排列有以下特点(这里我们用数字来代表单个字符)

\(1, 2, 3, 4, 5, ...,N,N+1,N+2,...,2N\)

其中,N即为旋转前字符串的最后一个字符,而N+1即为旋转后新增字符串的第一个字符,简而言之,就是
\(Str[N]==Str[N+1]\)

根据旋转的规则,显然我们有N左边的字符串和N+1右边的字符串对应相等,即\(Str[1]==Str[N+2]\),以此类推。

而且,题设中所寻找的无限字符串第K位置上的数,总是在N+1 ~ 2N范围之内,所以我们可以不断的二分缩小查找区间,让N+1 ~ 2N内的问题变为1 ~ N内的问题。

也就是对于题目 N+2<=K<=2*N, Str[K] = Str[K-N-1],而对于K==N+1的情况,要进行特判

以下为代码

#include<iostream>
#include<string>
using namespace std;
string S;
long long k, t;
void Solve(long long K)
{
//递归推出条件即为n收敛到子字符串内,便输出推出递归
	if (n <= S.size())
	{
		cout << S[n - 1];
		return;
	}
	long long N = S.size();
	while ((N << 1) < K)N <<= 1;
	//这里使用左移位替代乘2
	//通过不断乘以二来试探出解题所需要的最小N(即满足使得N+1<= K<=2*N的N)
	K = K - N - 1;//将问题区间缩小至1~N
	if (K == 0)K = N;//对于K==N+1情况的特判
	Solve(K);//继续递归缩小区间

}
int main()
{
	cin >> S >> k;//数据输入
	Solve(k);
	return 0;
}

标签:字符,Code,洛谷,Cow,long,旋转,Solve,字符串,include
From: https://www.cnblogs.com/CrescentWind/p/17728572.html

相关文章

  • LeetCode 918. 环形子数组的最大和
    环形子数组的最大和(medium)题目链接:918.环形子数组的最大和题目描述:给定一个长度为n的环形整数数组nums,返回nums的非空子数组的最大可能和。环形数组意味着数组的末端将会与开头相连呈环状。形式上,nums[i]的下一个元素是nums[(i+1)%n],nums[i]的前一个元素......
  • LeetCode 53. 最大子数组和
    最大子数组和(medium)题目链接:53.最大子数组和题目描述:给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。示例1:输入:nums=[-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组[4,-1,2,1]的和最大......
  • leetcode21. 合并两个有序链表
    合并两个有序链表题目链接21.合并两个有序链表将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例1:输入:l1=[1,2,4],l2=[1,3,4]输出:[1,1,2,3,4,4]示例2:输入:l1=[],l2=[]输出:[]示例3:输入:l1=[],l2=[0]输出:[0......
  • 体验亚马逊的 CodeWhisperer 感觉
    CodeWhisperer是亚马逊推出的辅助编程工具,在程序员写代码时,它能根据其内容生成多种代码建议。CodeWhisperer目前已支持近10几种语言,我是用java语言,用的开发工具是idea,说一下我用的情况。亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案......
  • Educational Codeforces Round 155 (Rated for Div. 2)
    EducationalCodeforcesRound155(RatedforDiv.2)A.Rigged!解题思路:若存在\(s[i]>=s[1]\)并且\(e[i]>=e[i]\),那么答案为\(-1\).否则,答案为\(s[1]\).代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;constintN=1e6+10;con......
  • typescript: vscode 配置环境
    可以在Node.jscommandprompt下,转到项目文件,进行命令行配置  https://code.visualstudio.com/docs/typescript/typescript-tutorialnpminstall-gtypescriptnpminit-ytsc--versionnpminstalleslint--save-devnpminstalltypescripttypescript-eslint-pars......
  • Codeforces463-E.Team Work-组合数、DP
    Codeforces463-E.TeamWork题意:求\[\sum_{i=1}^n\binom{n}{i}i^k\]其中\(1\leqn\leq10^9\),\(1\leqk\leq5000\)。题解:其实这个题\(k\)的数据范围就已经暗示了做法的复杂度——应该是要去考虑根据\(k\)去递推了。首先为了方便,\(i=0\)这一项完全可以补上,用类似生成函......
  • Educational Codeforces Round 155 (Rated for Div. 2)
    比赛链接A.Rigged!题目链接就是一个比较简单的模拟就可以解决,如何判断能不能第一只需要考虑比他力量大的耐力是不是也比他大就行,而只要比他大,他就不可能第一,否则输出他的力量作为标杆就行,这样也可以避免比他力量小的也可以举起来。#include<bits/stdc++.h>usingnamespaces......
  • 她是 Codeforces 第四名,也是知名视频平台bilibili的“网红”
    在2023年9月24日~9月25日举办的EducationalCodeforcesRound155(RatedforDiv.2)上,以优秀成绩拿下第四名仅学了ACM一年的Nanani,成为最夺目的选手之一。而且虽然是仅学了一年的选手,但她取得优异成绩后,不少网友并不感到陌生,纷纷留言:这不是bilibili上天天直播爆切神仙题的妹子......
  • [LeetCode] 1353. Maximum Number of Events That Can Be Attended 最多可以参加的会
    Youaregivenanarrayof events where events[i]=[startDayi,endDayi].Everyevent i startsat startDayi andendsat endDayi.Youcanattendanevent i atanyday d where startTimei<=d<=endTimei.Youcanonlyattendoneeventatanytime ......