求助dalao差一点点

P3612 [USACO17JAN] Secret Cow Code S

hrill @ 2022-12-25 07:21:11

以下是本蒟蒻的错解 但是我发现只需要把第一个while放进第二个while就能AC蒟蒻没想通为什么QAQ


by hrill @ 2022-12-25 07:21:27

https://www.luogu.com.cn/record/97925964


by 心灵震荡 @ 2022-12-25 08:49:24

@hr1002151016 我也想有一台能看到别人评测记录的电脑


by hrill @ 2022-12-25 09:13:44

@busy_programmer ```cpp

include <iostream>

include <string>

define ll long long

using namespace std; string ss; ll n,len; int main() { cin>>ss; cin>>n; len=ss.size(); ll t=len; while(t<n) t*=2; while(n>len) { t/=2; n=n-t-1; if(n==0) n=t; } cout<<ss[n-1]; return 0; }


by hrill @ 2022-12-25 09:14:46

@busy_programmer 对不起QAQ但是我不会粘贴,我以为您能看你看到的,真的不好意思


by hrill @ 2022-12-25 09:18:17

@busy_programmer 请问这样可以吗https://www.luogu.com.cn/paste/uhez8rzy


by 心灵震荡 @ 2022-12-25 11:33:13

别急,我看看


by 心灵震荡 @ 2022-12-25 11:51:25

@hr1002151016

因为每次旋转都是把原字符串的长度乘 2,每次求出的 t 其实是包含位置 n 的最短的串长(第一个 while 循环就是模拟旋转操作的过程)。

下面再看第二个 while 循环:

t/=2;
n=n-t-1;

这个操作其实就是先找到当前字符串的旋转前子串的长度,再找到第一个子串里与位置 n 相同的字符(因为原字符串就是由第一个字串翻转而来的)。

例如当前字符串是COWWOC,执行完第一行后的 t 就变为了 3,假设 n=5,那么 n 表示的就是第 5 个字符 O,而它显然是从前一个子串 COW 旋转而来的, 这个操作就找到了子串 COW 里的 与原来的第 n 位相同的字符。

通过这样不断地操作,就能找到经过无限次翻转的字符串中的第 n 位在最原始的子串中的位置,输出该值即可。


by hrill @ 2022-12-25 12:45:03

@busy_programmer 好的,谢谢您,我明白了


|