P3612. Secret Cow Code S

考点

  • 分治
  • 字符串

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

int main()
{
string s;
ll n, len;
cin >> s >> n;
len = s.length();
while (len < n)
len *= 2;
while (len > s.length())
{
if (n > len / 2)
{
if (n == len / 2 + 1)
n = len / 2;
else
n -= len / 2 + 1;
}
len /= 2;
}
cout << s[n - 1];
return 0;
}

思路

典型的分治题

题目大意是说,每次Copy一份当前字符串,把它最后一个字母挪到最前面,再接到原字符串后面,循环往复

假设原字符串为a,复制的字符串为b,那么每个字符串都是由a+b的格式组成的

先求出n所在字符串的长度len,然后进行以下判断:

  • n的位置在len/2及以内,说明是在原字符串a,那么n不变
  • n的位置大于len/2,将其位置映射到a中
  • len除以2
  • 循环往复,直到len等于最初始的字符串长度