トピック
原題リンク: aaaはとても難しい
一連の考え
明らかに、位置 pにはマッピング関係があります(文字列は再帰的な関係を形成するため)。
例えば:
s=abcd、6を見つける
abcd dabc
dは、後半の文字列に対応する前半の文字列の最後の位置にあります。
aは、後半の文字列に対応する前半の文字列の 2 番目の位置にあります。
実際には 6 が前半文字列の最初の位置であることがわかったので、s[1]='a' を出力します。
分割統治アルゴリズムに属する範囲を継続的に狭めることによって初期位置を決定します。
コード
#include <bits/stdc++.h>
#define int long long
using namespace std;
string s;
int m,k,siz,p,mid;
signed main()
{
cin>>s>>m;
k = m;
siz = s.size();
p = siz;
while(p <= m) p *= 2;//是先找到第一个>m的2的次幂 p
while(p > siz)//当p<=siz时结束
{
mid = p / 2;
if(mid < k) k = k - mid - 1;
if(k == 0) k = mid;
p /= 2;
}
cout<<s[k - 1];
return 0;
}