稍大的串—题解

P1737 [NOI2016] 旷野大计算 题解 本篇题解作为旷野大计算的题解,思路清晰,解法自然,逻辑严谨,你可以利用这篇题解,为自己的解题之旅进行热身。苯蒟蒻相信,这篇优美的题解,可以给拼搏于获奖的逐梦之路上的你,提供一个有力的援助。不好意思走错片场了。整体代码就不往上放了,这里是评测记录。利用好 �(�)S(x) 函数。该函数是本题的灵魂。这话说着容易做起来难。极限是本题的经脉,使灵魂有了承载。二者结合,我认为是本题最重要的思想。利用连续函数构造分段函数,是二者结合的具体体现。注意计算节点的优化,有些可以特殊处理的就拿出来单独处理。 阅读详情
标题:稍大的串


  串可以按照字典序进行比较。例如:
  abcd 小于 abdc


  如果给定一个串,打乱组成它的字母,重新排列,可以得到许多不同的串,在这些不同的串中,有一个串刚好给定的串稍微大一些。科学地说:它是大于已知串的所有串中最小的串。你的任务就是求出这个“稍大的串”。


例如:
输入串:
abfxy
程序应该输出:
abfyx


再例如:
输入串:
ayyyxxff
程序应该输出:
fafxxyyy


数据规模约定:
  输入的串不超过1000个字符。


特例:
  如果已知的串已经是所有重组串中最大的,则原样输出读入的那个串。




资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗  < 1000ms




请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。


所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。

注意:主类的名字必须是:Main,否则按无效代码处理。


解题思路: 刚开始想的是,利用康拓展开的逆运算去解决,最后发现大数据过不了。由于我们只需要求出一个序列的下一个,就直接模拟吧!


方法一:大数据无感

import java.math.BigInteger;
import java.util.Arrays;
import java.util.Scanner;

/**
 * 
 *  康拓展开 
 *
 */

public class Main2
{
	public static BigInteger[]dp = new BigInteger[1000];
	public static void main(String[] args)
	{
		long t = System.nanoTime();
        Scanner sc = new Scanner(System.in);
	    String str = sc.nextLine();
	    // 初始
	    init();
	    char c[] = str.toCharArray();
	    Arrays.sort(c);
	    
	    if (str.equals(new StringBuffer(String.valueOf(c)).reverse().toString()))
         System.out.println(str);
	    else
	    {
	    	long result = getHash(str.toCharArray());
	    	String s = reverHash(++result, c);
	    	while (s.compareTo(str)<=0)
	    	{
	    		s = reverHash(++result, c);
	    	}
	    	System.out.println(s);
	    }
	    System.out.println(System.nanoTime() - t + " ns");
	}
	
	private static String reverHash(long num, char[] c)
	{
	    boolean step[] = new boolean[c.length];
	    StringBuffer sb = new StringBuffer();
	    int j,k;
	    for (int i = 0; i < c.length; i++)
	    {
	    	long temp = num / dp[c.length-1-i].longValue();
	    	num -= temp * dp[c.length-1-i].longValue();
	    	for (j=0,k=0; k <= temp; j++)
	    	{
	    		if (!step[j]) k++;
	    	}
	    	step[j-1] = true;
	    	sb.append(c[j-1]);
	    }
		return sb.toString();
	}

	private static long getHash(char[] c)
	{
		long sum = 0;
		for (int i = 0; i < c.length; i++)
		{
		    long count = 0;
		    for (int j = i+1; j < c.length; j++)
		    	if (c[i] > c[j]) count++;
			sum += count * dp[c.length-1-i].longValue();
		}
		return sum;
	}
	
	private static void init()
	{
		BigInteger b1 = new BigInteger("1");
		dp[0]=dp[1]=BigInteger.ONE; 
        for (int i = 2; i < 1000; i++)
        {
       	  b1 = b1.multiply(BigInteger.valueOf(i)); 
       	  dp[i]= new BigInteger(b1.toString());
        }
	}
}

方法二: 完美

import java.util.Arrays;
import java.util.Scanner;



public class Main6
{
    public static void main(String[] args)
	{
    	Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        char c1[] = str.toCharArray();
        char c2[] = null;
        boolean flag = false;
        
        for (int i = c1.length-1; i > 1; i--)
        {
        	if (c1[i] > c1[i-1])
        	{
        		char temp = c1[i];
        		c1[i] = c1[i-1];
        		c1[i-1] = temp;
        		c2 = new char[c1.length-i];
        		System.arraycopy(c1, i, c2, 0, c2.length);
        		Arrays.sort(c2);
        		flag = true;
        		break;
        	}
        	if (flag) break;
        }
        
        // 一般情况匹配成功
        if (flag)
        {
        	for (int i = 0; i < c1.length-c2.length; i++)
        		System.out.print(c1[i]);
        	for (int i = 0; i < c2.length; i++)
        		System.out.print(c2[i]);
        	System.out.println();
        }
        else
        {
        	// 类似  19876 这样的字符串,还有 29872这样的
        	if (str.length() > 1 && c1[0] < c1[1])
        	{
        		int t = -1;
        	    for (int i = str.length()-1; i>0 ; i--) if (c1[0] < c1[i]){ t = i; break;}
        			char temp = c1[0];
        			c1[0] = c1[t];
        			c1[t] = temp;
        			
        			c2 = new char[c1.length-1];
        			System.arraycopy(c1, 1, c2, 0, c2.length);
        			Arrays.sort(c2);
        			for (int i = 0; i < c1.length-c2.length; i++)
        				System.out.print(c1[i]);
        			for (int i = 0; i < c2.length; i++)
        				System.out.print(c2[i]);
        			System.out.println();
        	}
        	// 特例
        	else
        		System.out.println(str);
        }
        
	}
}


P10564 [ICPC2024 Xi‘an I] Rubbish Sorting 题解 P10564 [ICPC2024 Xi'an I] Rubbish Sorting 题解 阅读详情

相关推荐

Date:January 4th Title:小信反转串 题解

Date:January 4th Title:小信反转串 题解

weixin_58799965的博客 469

蓝桥杯算法提高

蓝桥杯算法提高1.排列数1. 排列数  时间限制:1.0s   内存限制:256.0MB    问题描述  0、1、2三个数字的全排列有六种,按照字母序排列如下:  012、021、102、120、201、210  输入一个数n  求0~9十个数的全排列中的第n个(第1个为0123456789)。输入格式  一行,包含一个整数n输出格式  一行,包含一组10个数字的全排列样例输入1样例输出0123...

stay hungry ! stay foolish! 1347

UE5 Decal混合进阶:如何用DBuffer实现自定义Normal插值(附完整材质配置流程)

本文深入解析了UE5中利用DBuffer技术实现Decal自定义Normal插值的完整流程。通过详细的材质配置步骤和核心算法说明,帮助开发者突破传统混合模式限制,掌握高级法线控制技巧,特别适合需要精细环境细节的3A级项目开发。

table的专栏 224

稍大的串

标题:稍大的串 串可以按照字典序进行比较。例如: abcd 小于 abdc 如果给定一个串,打乱组成它的字母,重新排列,可以得到许多不同的串,在这些不同的串中,有一个串刚好比给定的串稍微大一些。科学地说:它是大于已知串的所有串中最小的串。你的任务就是求出这个“稍大的串”。 例如: 输入串: abfxy 程序应该输出: abfyx 再例如: 输入串: ayyyxxff 程序应该输出: fafxxyyy 数据规模约定: 输入的串不超过1000个字符。 特例: 如果已知的串已经是所有重组串中最大的,则原样输出读入

Z7759的博客 219

Web渗透(一)CRLF注入简介

CRLF注入简介1、基础知识2、原理分析3、漏洞挖掘4、防御手段5、CRLF Payload: 1、基础知识 HTTP报文结构 从上图可以看到:HTTP报文由三部分组成:状态行、首部、主体。 可以看到状态行和首部中的每行都是以回车符(\r,%0d,CR)和换行符(\n,%0a,LF)结束。 十六进制编码分别为0x0d和0x0a,URL编码为%0D和%0A 这是因为HTTP规范中行应该使用CRLF结束。另外,首部和主体由两个CRLF分隔。 2、原理分析 CRLF是 “ 回车+换行 ”(\r\n)的简称。

weixin_39157582的博客 6818

[Spawn service failed. Exiting] ROS2运行turtlebot3_gazebo例程卡住_报错

[Spawn service failed. Exiting] ROS2运行turtlebot3_gazebo例程卡住_报错

Feizhai2的博客 4861

稍大的串(思维+全排列)

串可以按照字典序进行比较。例如: abcd 小于 abdc 如果给定一个串,打乱组成它的字母,重新排列,可以得到许多不同的串,在这些不同的串中,有一个串刚好给定的串稍微大一些。科学地说:它是大于已知串的所有串中最小的串。你的任务就是求出这个“稍大的串”。 例如: 输入串: abfxy 程序应该输出: abfyx 再例如: 输入串: ayyyxxff 程序应该输出: fafxxyyy 数据规模约定:...

smilng的博客 244

Zemax操作16--激光谐振腔(含晶体)

谐振腔(含晶体)

lzy750750的博客 8313

蓝桥杯-决赛C组第五届java

目录 第1题 年龄巧合 第2题 出栈次序 第3题 数字拆分 第4题 生物芯片 第5题 稍大的串 第6题 殖民地 第1题 年龄巧合 小明和他的表弟一起去看电影,有人问他们的年龄。小明说:今年是我们的幸运年啊。 我出生年份的四位数字加起来刚好是我的年龄。表弟的也是如此。已知今年是2014年,并且,小明说的年龄指的是周岁。 请推断并填写出小明的出生年份。...

萤火虫草花星的博客 681

微信小程序 - 最新详细实现调起手机摄像头拍摄身份证人像面和国徽面取景框功能,在拍照相机上增加身份证证件照的轮廓或自定义文字,支持替换扫描拍摄辅助线图片及文本,小程序实现拍照身份证时带取景轮廓框拍摄!

微信小程序,身份证,证件照,人像,证件照提示框模板,vue身份证拍照框,摄像机相机里有引导内容,取景框拍摄,微信小程序实现拍照界面自定义实现,自拍人相框拍摄,取景框,户口簿取景框,画布指定区域生成图片,微信小程序身份证正反面拍照如何加入辅助图片引导照片,身份证取景框拍摄,服务器,上传,正反面,调起手机摄像头:拍摄身份证的正反面,自定义身份证取景框,在相机上绘制“身份证轮廓“与提示文字,拍摄身份证时出现人像框怎么实现,在相机上增加图片和文字,微信小程序怎么给调起的相机加入自定义图片,小程序实现给相机上面

🏆 前端领域优质创作者 1万+

FPGA+CUYSB3014实现USB3.0功能

CYUSB3014是赛普拉斯在近几年推出的新一代USB3.0的外设控制器,可以解决USB2.0带宽限制,或者单独开发USB协议和驱动的难题。赛普拉斯将CYUSB3014简称为EZ-USB FX3,具有高度的灵活特性,开发人员只需要下载FX3的固件库,就能使用USB3.0的功能。目前在一些电子产品中,使用主控器加PHY芯片最流行的方式是用FPGA+FX3这种搭配来实现USB3.0接口。......

D_Katter的博客 7065

牛客题霸 [最长重复子串] C++题解/答案

牛客题霸 [最长重复子串] C++题解/答案 题目描述 一个重复字符串是由两个相同的字符串首尾拼接而成,例如abcabc便是长度为6的一个重复字符串,而abcba则不存在重复字符串。 给定一个字符串,请编写一个函数,返回其最长的重复字符子串。 若不存在任何重复字符子串,则返回0。 题解: 调用函数时记得传地址不然只能通过百分之六十 每次选定起点和长度,判断是否存在重复字符串 代码: class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改

qq_35975367的博客 1335

晶闸管选型参数,结构原理,工艺与注意问题总结

闸管(Thyristor)是一种半导体开关器件,也被称为可控硅整流器(SCR, Silicon Controlled Rectifier)。它可以在高电压和大电流条件下工作,常被用于交流电的控制和整流。本文对晶闸管的工作原理,结构特点,工艺流程,选型参数及设计注意事项进行总结。

fydar的博客 1281

【蓝桥杯 CA 好串的数目】题解

好像很简单的样子

m0_57883655的博客 967

MOS管基础知识及应用电路Multisim仿真

本文系统介绍了MOS管的基础知识及其在电子电路中的典型应用。首先详细解析了MOS管的基本结构、分类和工作原理,包括NMOS、PMOS及CMOS的特性差异。重点阐述了MOS管的三种放大组态电路(共源、共漏、共栅)及其小信号模型分析。随后通过Multisim仿真验证了MOS管在防反接电路、开关电路、放大电路、逻辑门电路、电平转换电路和开关电源(BUCK、BOOST、BUCK-BOOST)等应用中的实际表现。文章还深入探讨了自给偏压和分压式偏置电路的设计要点。全文通过理论分析与仿真实验相结合的方式,全面展示了MO

XU157303764的博客 1482

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

AK串 II 题解(爱思创平台)

AKAAKAKAKKAAKK…如果我们在键盘上打出一个AK串(只由字符A和K组成的固定位数的字符串),就可以AK全场么?不可以,有些AK串不允许出现!现在给定整数n和m,n表示AK串的位数,m表示所有n位AK串中不允许出现的前缀,请输出合法的n位AK串的个数。

m0_61541519的博客 758

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

机器人搬重物题解&特殊矩阵的压缩存储、串、树

串,即字符串,是由零个或多个字符组成的有限序列(也是一种特殊的线性表,数据元素之间呈线性关系,区别就是串的有限对象只能是字符集,串中的增删改查以子串为操作对象)2.当n>1时,其余结点可分m(m>0)个互不相交的有限集合,其中每个集合本身又是一棵树,并且称为根结点的子树。1.描述结点之间的关系:祖先结点,子孙结点,双亲结点(父结点),孩子结点,兄弟结点,堂兄弟结点。基本概念:树是n个结点的有限集合,n=0时为空树,这是一种特殊的情况。4.有序树——树中结点的各子树从左到右是有次序的,不能互换。

2401_88455976的博客 1294

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

大一下考核力扣题题解

有的,仔细观察会发现,当右侧的最值大于左侧的最值的时候,就需要加上左侧的值-当前柱子的值,理由是因为右侧的最值不会降低,只会增大或者不变,如果此时比左边大,那么也不需要此时右侧最值了;同理,左侧也是如此;按照这道题来分析,每天可以买股也可以出股,两个选择,把每一步抽象出来,如果要出股,那么前一天必定股票存在的,入股前一天股票必定是不存在的,那么就需要把股票用二维数组表示两种状态,0为出股,1为入股;遇到此类问题时,要先分类,比如遇到[和遇到字符的处理情况,然后再根据题意推断具体遇到时的情况。

2401_87366139的博客 2124

『面试题』最长不重复子串

『题目』:  最长不重复子串就是从一个字符串中找到一个连续子串,该子串中任何两个字符都不能相同,且该子串的长度是最大的。 输入:输入包含多个测试用例,每组测试用例输入一行由小写英文字符a、b、c、…x、y、z组成的字符串,字符串长度不大于10000。 输出:对于每组测试用例,输出最大长度的不重复字符串。 样例: 输入 输出 absd 4 abba 2 abdffd 4 ...

Gavinjou大笨象的博客 6821

AtCoder题解集锦

AtCoder题解集锦 自己从全网整理的一些优质AtCoder题解,目前只有ABC(AtCoder Beginner Contest)的C~F。不定期更新。 如您有更多需求,欢迎私信我或在评论区留言! 用法 表格查找 找到对应比赛的行 找到对应题目的列 该位置即为对应的题解 题号查找 在浏览器中按下搜索快捷键Ctrl+F,调出搜索窗口。 输入对应的题号,如244F 找到对应题解 标题查找 在浏览器中按下搜索快捷键Ctrl+F,调出搜索窗口。 输入题目标题,如Shortest Good

天生我材必有用,千金散尽还复来。 1万+

3G大一下二面题解

第一个人(11号)将灯全部关闭,第二个人(22号)将编号为22的倍数的灯打开,第三个人(33号)将编号为33的倍数的灯做相反处理(即,将打开的灯关闭,将关闭的灯打开)。依照编号递增顺序,以后的人都和33号一样,将凡是自己编号倍数的灯做相反处理。−1]之间的所有整数,则称之符合"欢乐的跳",如数组{1,4,2,3}{1,4,2,3}符合"欢乐的跳",因为差的绝对值分别为:3,2,13,2,1。(10)10=(1010)2(10)10=(1010)2,其中11的个数为22,00的个数也为22,称此数为B类数;

2401_86810295的博客 1168

BUUCTF-[极客大挑战 2019]LoveSQL题解

BUUCTF-[极客大挑战 2019]LoveSQL题解

2401_88570825的博客 1144

不重复最长子串题解

不重复最长子串题解 找到一个字符串的最长不重复子串的有效办法是采用滑动窗口 思路如下:是假设在一个字符串上存在一个可滑动窗口,滑动窗口依赖两个指针Start和End来确定窗口位置。另外还需要借助HashMap来存储子串的字符。 这样,只需要知道Start和End的位置就可以确定子串的位置,进而得到子串的长度。Start和End的的移动逻辑如下:Strat和End刚开始都指向第0个字符,此时将该字符作为Key,0作为value放入Map。之后End首先向前移动一位,若End所指向的字符是一个新字符,即滑动窗口

smallkneif的博客 203

初级数据结构——串

这期我们一起深入学习初级数据结构——串,数据结构中的串(String)是一种非常常见且基础的数据类型,它由零个或多个字符组成的有限序列。串是由零个或多个字符组成的有限序列,一般记为S=“a1a2…an”(n>=0),其中S是串名,双引号(或单引号)括起来的字符序列是串的值,ai(1

ycs66的博客 2045
上一篇: 生命之树—题解
下一篇: 1003—IP聚合
慕一春
博客等级 码龄12年 19粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值