P1124 题解

1|0题目大意

一个长度为 \(n\) 的字符串 \(S\),进行以下操作。

假设 \(s\)acbdef,每一次将首字母移至末尾,得到 \(6\) 个字符串:

acbdef cbdefa bdefac defacb efacbd facbde

将每个字符串的首字母排序:

acbdef bdefac cbdefa defacb efacbd facbde

每个字符串的末尾连在一起为 fcabde,这就是 \(S'\)

最后让你反推出 \(S\)

2|0解题思路

  1. 原串将首字母移至末尾就得到构造串。
  2. 构造的第一个串就是原串。
  3. 构造的其余字符串的“末尾字符”是“该串首字母”在“原串 \(ans[\ ]\) ”中的前一个字符。
  4. 维护 \(cur\) 表示 \(s1[\ ]\) 的位置,则 \(s_{cur}\)\(s1_{cur}\) 的前一个字符。
  5. 倒序确认原串的位置,因为倒序的字符在 \(s1[\ ]\) 中寻找是有序的,反之正序确认则需要在 \(s[\ ]\) 中找,是无序的。

3|0代码

#include<bits/stdc++.h> using namespace std; int n, p, cur; char s[10005], s1[10005], ans[10005]; // s1表示排序后的串,s表示排序前的串 bool vis[10005]; int main() { cin >> n; for(int i = 1; i <= n; i++) { cin >> s[i]; s1[i] = s[i]; } cin >> p; sort(s1 + 1, s1 + n + 1); ans[1] = s[p]; // 首字母确认 for(int i = 1; i <= n; i++) { if(s1[i] == s[p]) { cur = i; // 找构造的第一个串编号 break; } } for(int i = n; i >= 2; i--) { // 倒序确认位置 vis[cur] = 1; // 标记s1[cur]已经使用 ans[i] = s[cur]; // 原串i个位置的字母就是s[cur] for(int j = n; j >= 1; j--) { if(s1[j] == s[cur] && !vis[j]) { cur = j; break; } } } for(int i = 1; i <= n; i++) { cout << ans[i]; } return 0; }

__EOF__

本文作者cyf1208
本文链接https://www.cnblogs.com/cyf1208/p/17773519.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   cyf1208  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示