首页 > 其他分享 >P1124 题解

P1124 题解

时间:2023-10-18 22:38:43浏览次数:34  
标签:cur int 题解 s1 原串 首字母 ans P1124

题目大意

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

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

acbdef
cbdefa
bdefac
defacb
efacbd
facbde

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

acbdef
bdefac
cbdefa
defacb
efacbd
facbde

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

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

解题思路

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

代码

#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;
}

标签:cur,int,题解,s1,原串,首字母,ans,P1124
From: https://www.cnblogs.com/cyf1208/p/17773519.html

相关文章

  • Linux 环境下(Ubuntu)webbench的安装问题解决与使用
    webbench最多可以模拟3万个并发连接去测试网站的负载能力。并发能力比较高,可以测试https及动态静态页面。适合中小型网站测试承受能力。原理:父进程fork若干个子进程,每个子进程在用户要求时间或默认的时间内对目标web循环发出实际访问请求,父子进程通过管道进行通信,子进程通过......
  • P6346 题解
    题目大意如果\(\texttt{Kevin}\)想和第\(i\)个人交朋友,要么需要认识\(a_i\)个人,要么付出\(b_i\)的代价,他让你使\(\texttt{Kevin}\)与所有的人交朋友。解题思路如果想水到\(15\)分,也就是所有\(b_i\)都等于\(1\)的情况,那我们可以直接排个序,然后遍历一下每一个人,......
  • P2198 题解
    解题思路激光塔一定在最后。\(f_{i,j}\)表示前\(i\)个位置放\(j\)(\(j\lei\))个放射塔,那么\(i-j\)个干扰塔的伤害。若第\(i\)个位置放放射塔:\(f_{i,j}=f_{i-1,j-1}+(j-1)\timesg\times[t+b\times(i-j)]\)若第\(i\)个位置放干扰塔,也就是\(j<i\):\(f_{i,j}=\max\{f_{i-......
  • P7974 题解
    解题思路首先可以确保每一次列的方向一定不会与\(s\)到\(t\)的方向相反。不妨设\(l=\min\{s,t\}\),\(r=\max\{s,t\}\)。对于每次移动,所花体力值如下:显然,从\(l\)到\(r\),一定要翻过\([l,r]\)间最高的一个,区间最大我们毫不犹豫地选择ST表,然后我们思考一下,令\(h_x=\m......
  • P4814 题解
    解题思路对于每条边\((u,v)\),权值为\(w\),假设存在一条经过这一条边的路径,其最短距离为\(a\)到\(u\)的最短路加上\(v\)到\(b\)的最短距离加上\(w\),若这个值都大于\(d\),则不可能关闭这条边。由于边权非负,所以可采用dijkstra来处理最短路。因为为有向边,所以可以再建......
  • C++常见入门题题解
    前言因为本人目前比较菜,所以给出的题解都是按照自己的学习进度来的,所以难度是一个循序渐进的过程,由于本人水平有限,望读者能够指出谬误,共同进步。回文数输出#include<bits/stdc++.h>//万能头usingnamespacestd;intmain(void){vector<int>font;//定义一个整型的向......
  • 题解 CF1651F【Tower Defense】
    题解CF1651F【TowerDefense】problem一个塔防游戏。一共有\(n\)个塔按\(1\simn\)的顺序排成一列,每座塔都有魔力容量\(c_i\)和魔力恢复速率\(r_i\)。对于一座塔\(i\),每过一秒它的魔力\(m_i\)会变为\(\min(m_i+r_i,c_i)\)。每座塔初始时满魔力。一共有\(q\)个......
  • 【题解 CF840C & P4448】 On the Bench & 球球的排列
    OntheBench题面翻译给定一个序列\(a(a_i\le10^9)\),长度为\(n(n\le300)\)。试求有多少\(1\)到\(n\)的排列\(p_i\),满足对于任意的\(2\lei\len\)有\(a_{p_{i-1}}\timesa_{p_i}\)不为完全平方数,答案对\(10^9+7\)取模。题目描述Ayearagoonthebenchinpu......
  • P9506 题解
    blog。Firstsolution/kx。容易想到断环成链。打开标签发现是DP,于是就可以DP了。code,时间复杂度\(O(\text{能过})\)。......
  • 算法笔记-有效括号序列题解
    描述给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列。括号必须以正确的顺序关闭,"()"和"()[]{}"都是合法的括号序列,但"(]"和"([)]"不合法。数据范围:字符串长度0≤n≤10000要求:空间复杂度O(n),时间复杂......