分治+字符串(p3612)

P3612 [USACO17JAN] Secret Cow Code S

题目描述

奶牛们正在实验秘密代码,并设计了一种方法用于生成无限长度的字符串,作为他们代码的一部分。

给定一个字符串 \(s\),令 \(F(s)\)\(s\) 后接 \(s\) 向右“旋转”一个字符的结果(在右旋转中,\(s\) 的最后一个字符旋转并成为新的第一个字符)。给定初始字符串 \(s\),奶牛们通过重复应用 \(F\) 来构建他们的无限长度代码字符串;因此每一步都会使当前字符串的长度翻倍。

给定初始字符串和一个索引 \(N\),请帮助奶牛计算无限代码字符串中第 \(N\) 个位置的字符。

输入格式

输入由一行组成,包含一个字符串和 \(N\)。字符串最多由 30 个大写字母组成,且 \(N \leq 10^{18}\)

请注意,\(N\) 可能太大,无法放入标准的 32 位整数中,因此你可能需要使用 64 位整数类型(例如,C/C++ 中的 "long long")。

输出格式

请输出从初始字符串构建的无限代码字符串的第 \(N\) 个字符。第一个字符的位置为 \(N=1\)

输入输出样例 #1

输入 #1

COW 8

输出 #1

C

说明/提示

在这个例子中,初始字符串 COW 按以下方式扩展:

COW -> COWWCO -> COWWCOOCOWWC

AC 代码

#include<bits/stdc++.h>
using namespace std;

int main(){
    long long n;
    string s;
    cin>>s>>n;
    int len=s.length();
    while(n>len){
        long long i=len;
        while(n>i*2) i*=2;
        n-=(i+1);
        if(n==0) n=i;
    }
    cout<<s[n-1]<<endl;
    return 0;
}
posted @ 2025-11-10 15:35  sadmax11  阅读(5)  评论(0)    收藏  举报