上海マンスリーコンペティション グループ B 2023 年 1 月コンペティション: 無制限の延長

トピック

原題リンク: 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;
}

おすすめ

転載: blog.csdn.net/weq2011/article/details/128908888