当前位置: 首页 > news >正文

题解:洛谷 P3612 Secret Cow Code

【题目来源】

洛谷:P3612 [USACO17JAN] Secret Cow Code S - 洛谷(luogu.com.cn)

【题目描述】

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

给定一个字符串 \(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\)

【输入样例】

COW 8

【输出样例】

C

【核心思想】

  1. 问题分析:给定初始字符串 \(s\),通过不断应用 \(F(s) = s + rotate\_right(s)\) 构造无限长字符串(每次长度翻倍)。给定位置 \(N\)\(N \leq 10^{18}\)),求该位置的字符。本质上是递归定位 + 逆向推导问题:利用字符串生成的对称性,从最终长度逆向缩回到初始字符串的对应位置。

  2. 算法选择

    • 逆向推导:不构造无限字符串,而是从目标位置 \(N\) 出发,逆向追踪其在初始字符串中的对应位置
    • 长度倍增分析:每次操作后长度为 \(len \times 2\),后半部分由前半部分右旋一位得到
  3. 关键步骤

    • 读取数据:读入字符串 \(s\) 和位置 \(N\)
    • 计算覆盖长度\(len1 = |s|\)\(len2 = len1\),不断 \(len2 \times 2\) 直到 \(len2 \geq N\)
    • 逆向定位(当 \(N > len1\)):
      • \(k = len2 / 2 + 1\)(后半部分的起始位置)
      • \(N \geq k\)
        • \(N = k\)(恰好是分割点),\(N \leftarrow N - 1\)(对应前半部分的最后一个字符)
        • 否则 \(N \leftarrow N - k\)(映射到前半部分的对应位置)
      • \(len2 \leftarrow len2 / 2\)(回退到上一阶段)
    • 输出 \(s[N-1]\)(字符串 \(0\)-based 索引)
  4. 时间/空间复杂度

    • 时间复杂度:\(O(\log N)\),每次循环长度减半
    • 空间复杂度:\(O(1)\),仅使用常数额外空间
  5. 逆向推导的核心思想

    • 生成规则的对称性\(F(s) = s + s'\),其中 \(s'\)\(s\) 右旋一位的结果,即 \(s'[i] = s[(i-1) \bmod |s|]\)
    • 后半部分的映射:若 \(N\) 在后半部分(\(N > len2/2\)),则 \(N\) 对应前半部分的 \(N - len2/2\) 位置,但需考虑右旋的偏移
    • 分割点的特殊处理\(k = len2/2 + 1\) 是后半部分的第一个位置,对应前半部分的最后一个字符(因右旋),故 \(N = k\) 时映射到 \(k-1\)
    • 对数级复杂度:每次迭代长度减半,\(10^{18}\) 最多约 \(60\) 次迭代,完全可接受
    • 适用于无限序列定位、递归映射、大数处理类问题

【解题思路】

【算法标签】

普及- #字符串入门

【代码详解】

#include <bits/stdc++.h>
using namespace std;int main()
{string s;       // 初始字符串long long len1; // 初始字符串长度long long len2; // 扩展后的字符串长度long long n;    // 要查询的位置long long k;    // 中间变量,用于计算分割点cin >> s >> n;  // 输入初始字符串和查询位置len1 = s.length();  // 获取初始长度len2 = len1;        // 初始化扩展长度// 计算字符串扩展后的最小长度,使其包含位置nwhile (len2 < n)len2 *= 2;  // 每次长度翻倍// 逆向计算原始字符串中对应的字符位置while (n > len1){k = len2 / 2 + 1;  // 计算中间分割点if (n >= k)       // 如果在后半部分{if (n == k)   // 正好是分割点n--;       // 调整到前一个位置elsen = n - k; // 调整到前半部分的对应位置}len2 /= 2;  // 长度减半,回到上一阶段}// 输出结果(注意字符串从0开始索引)cout << s[n - 1];return 0;
}

【运行结果】

COW 8
C
http://www.jsqmd.com/news/1410186/

相关文章:

  • Zotero免费突破300MB限制:ZotFile+坚果云实现文献附件无限同步
  • 深入解析JavaScript定时器:从setTimeout原理到防抖节流实战
  • 2026 年成都极简门选购避坑:资质、工厂实力、配套能力怎么看 - 市场沸点
  • 探索海鲜美味秘籍:帝王宫饭店十大招牌菜揭晓 - 官方资讯
  • SQLite零基础学习教程
  • 2026武昌区装修公司品质,这5家口碑最佳 - 滚动商讯
  • SketchUp硬件配置全解析:从CPU单核到专业显卡的精准匹配
  • ROS2在Ubuntu上的完整安装与卸载指南:从版本匹配到环境配置
  • 智能体生产环境评估:从基准测试到AlphaEval的工程实践
  • 2026装修行业代理记账口碑好的公司综合实力推荐,避坑优选指南 - 工业设备
  • 户口本翻译件怎么弄?户口本英文翻译完整办理流程是什么?步骤详解! - 实用干货补给站
  • 2026 年成都极简门怎么选?拆解报价差价真相,本地实力厂商盘点 - 市场沸点
  • 多智能体AI模拟课堂:基于双系统推理的教师认知训练系统
  • PVE虚拟机安装Windows 10:VirtIO驱动配置与性能优化指南
  • DualView架构解析:如何为AI智能体构建防提示词注入的安全防线
  • 基于认知理论定制LLM智能体:诊断策略与脚手架设计实践
  • LLM智能体长程任务困境:子目标驱动框架的设计与实践
  • 深圳市口碑好的奔驰维修选哪家 - 滚动商讯
  • 2026唐山婚纱摄影五家测评** - 摄影评价管
  • 基于DeepSeek的AI编程智能体Reasonix:从环境配置到实战开发
  • 2026年上海回收生肖茅台酒服务热线优选指南:从询价到成交一次说清 - geo交流
  • 2026开州负压防水材料实力测评,零套路靠谱商家优选 - 工业设备
  • 2026年度惊喜!7款AI论文网站测评,助力你轻松完成学术大作 - AI写论文
  • Jenkins SSH连接远程服务器:自动化部署的完整配置与实战指南
  • 2026年取水泵船厂家推荐指南:口碑好服务佳的厂家怎么选? - GrowthUME
  • PLC高效自学指南:从零到精通的系统性路径与实战方法
  • AI图像生成项目部署指南:从环境搭建到功能测试全流程
  • 上海黄金回收哪里靠谱,浦东大鱼凭什么成为本地** - 大鱼奢侈品
  • 【桂林市】2026CPPM证书职场晋升价值详解|本地产业适配+岗位进阶全指南 - 中采供培
  • 合肥肥东县安徽甲特装饰投诉处理及时吗 2026实力测评避坑指南 - 工业设备