P3612 [USACO17JAN]Secret Cow Code S

题目描述

The cows are experimenting with secret codes, and have devised a method for creating an infinite-length string to be used as part of one of their codes.

Given a string ss, let F(s)F(s) be ss followed by ss "rotated" one character to the right (in a right rotation, the last character of ss rotates around and becomes the new first character). Given an initial string ss, the cows build their infinite-length code string by repeatedly applying FF; each step therefore doubles the length of the current string.

Given the initial string and an index NN, please help the cows compute the character at the NNth position within the infinite code string.

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

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

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

输入格式

The input consists of a single line containing a string followed by NN. The string consists of at most 30 uppercase characters, and N \leq 10^{18}N1018.

Note that NN may be too large to fit into a standard 32-bit integer, so you may want to use a 64-bit integer type (e.g., a "long long" in C/C++).

第一行输入一个字符串。该字符串包含最多30个大写字母,并 N \leq 10^{18}N1018 。

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

输出格式

Please output the NNth character of the infinite code built from the initial string. The first character is N=1N=1.

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

输入输出样例

输入 #1
COW 8
输出 #1
C

说明/提示

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

COW -> COWWCO -> COWWCOOCOWWC

12345678

解题思路:

这翻译真的是恶心,估计是机翻的,英文再差也要去看英文,光看中文的话一定会被拐到坑里去。

第一步:写出基本功能,只能过部分样例:

 1 #include <iostream>
 2 #include<string.h>
 3 using namespace std;
 4 
 5 int main() {
 6     string s="COW";
 7     long long n=8;
 8     cin >> s >> n;
 9     for(int i = 0;s.length()<=n;i++) {
10         string s2 = s;
11         s += s2[s2.length() - 1];
12         for (int j = 0;j < s2.length()-1;j++) {
13             s += s2[j];
14         }        
15     }    
16     cout << s[n-1];
17     return 0;
18 }

 题目里给出的字符串长度是1000000000000000000,显然超出了字符串长度和longlong取值范围,这样的话我们不在去拼接字符串让它变长,而是推算下标为n的字符跟前面哪个坐标上的字符相同:

 1 #include <iostream>
 2 #include<string.h>
 3 using namespace std;
 4 
 5 int main() {
 6     string s = "COW";
 7     unsigned long long n = 8;
 8     cin >> s >> n;
 9   
10     while (n>s.length()) { //字符串长度不变,n不断减小
11         unsigned long long i = s.length();
12         while (n > i) //当n大于字符串长度时继续循环
13             i *= 2;
14         i /= 2; //这个时候字符串长度刚刚超过了n的位置,所以再往前退一次
15         //因为新字符串的第一个字符是旧字符串的最后一个位置,下标为n-(i+1)和n上的字符是相同的
16         n -= (i + 1); 
17         if (n == 0) //为防止下标出现-1,新字符串第一个字符和旧字符串最后一个字符是相同的
18             n = i;
19     }
20     cout << s[n - 1];//除过第一个字符,后续字符与原字符串相等
21     return 0;
22 }

 

posted @ 2022-01-28 00:00  葛杨杨  阅读(70)  评论(0编辑  收藏  举报