news 2026/6/5 1:32:33

UVa 146 ID Codes

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UVa 146 ID Codes

题目描述

2084 20842084年,政府为了加强对公民的控制并应对长期存在的法律与秩序问题,决定采取一项激进措施:为每位公民在左手腕植入一个微型计算机。该计算机存储个人身份信息,并包含发射器以便中央计算机追踪和监控人员的位置。

每个计算机的核心部分是一个唯一的身份识别码,最多由50 5050个字符组成,这些字符来自 26 个小写字母。任意给定的识别码所使用的字符集是随机选定的。生产识别码的复杂过程使得制造商更容易生产那些仅对已有字符进行重排的新识别码,而不是生成包含不同字母集合的全新识别码。因此,一旦选定一组字母,就会先将所有可能的排列使用完毕,然后再更换字母集合。

例如,假设某个识别码包含3 33a2 22b1 11c,那么在这些条件下,允许的60 6060个识别码中的三个按字典序从上到下依次是:

abaabc abaabc abaabc

题目要求编写程序,帮助生成这些识别码的后继(下一个字典序的识别码)。程序接收一个长度不超过50 5050的字符串(可能包含重复字符),输出该字符串对应字符集合的字典序后继,如果已经是最后一个,则输出No Successor

输入与输出格式

输入
输入包含多行,每行一个字符串表示一个识别码,以单独一行#结束。

输出
对于每个输入的识别码,输出其后继识别码或No Successor

样例输入

abaabc cbaba #

样例输出

ababac No Successor

解题思路

本题的核心任务是求一个给定字符串的字典序下一个排列。如果当前排列已是该字符集合所能构成的最大字典序排列,则输出No Successor

排列生成算法

字符串的“下一个排列”可以用标准的“下一个排列算法”来求解,该算法步骤如下:

  1. 从右向左扫描,找到第一个满足s[i] < s[i + 1]的位置i ii。如果找不到这样的i ii,说明整个序列是降序排列的,也就是字典序最大,没有后继。
  2. 从右向左扫描,找到第一个满足s[j] > s[i]的位置j jj
  3. 交换s[i]s[j]
  4. 将位置i ii之后的子串反转(即变为升序排列)。

该算法的时间复杂度为O ( n ) O(n)O(n),其中n nn为字符串长度(本题n ≤ 50 n \leq 50n50)。

使用标准库函数

C++ \texttt{C++}C++中,<algorithm>库提供了next_permutation函数,可以直接对字符串或容器求出下一个排列。如果已经是最后一个排列,该函数返回false,否则返回true并修改容器内容为下一个排列。

本题特殊之处

虽然题目描述中提到了字符集合的概念,但实际上我们只需要对输入字符串本身求下一个排列即可。因为next_permutation会自动处理重复字符和字典序逻辑,得到的就是该字符集合的下一个识别码。

代码实现

// ID Codes// UVa ID: 146// Verdict: Accepted// Submission Date: 2016-01-22// UVa Run Time: 0.000s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;intmain(){string line;while(getline(cin,line),line!="#"){if(next_permutation(line.begin(),line.end()))cout<<line<<endl;elsecout<<"No Successor"<<endl;}return0;}

复杂度分析

  • 时间复杂度:每次调用next_permutationO ( n ) O(n)O(n),其中n nn是字符串长度。
  • 空间复杂度:O ( n ) O(n)O(n),用于存储字符串。

总结

本题是一个典型的“下一个排列”问题,适合用来练习排列生成算法或熟悉标准库的使用。使用C++ \texttt{C++}C++next_permutation可以简洁高效地解决问题,无需手动实现排列生成逻辑。注意特殊情况——当输入字符串已经是最大字典序时,输出No Successor

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/30 16:08:28

2026测试变革:提示工程为何成为测试工程师的生存必修课

从代码到指令的范式迁移 2026年的软件测试领域正经历一场由AI驱动的能力重构。当传统自动化测试依赖脚本编写时&#xff0c;AI工具&#xff08;如大语言模型、视觉测试框架&#xff09;已能通过自然语言指令生成测试用例、定位缺陷并输出报告。这一变革将提示工程&#xff08;…

作者头像 李华
网站建设 2026/6/2 11:45:59

BXMya WOODWARD 8440-2052H 数字发电机控制器

8440-2052H是美国伍德沃德&#xff08;Woodward&#xff09;旗下EASYGEN-3200系列高性能数字发电机控制器&#xff0c;专为工业发电机组的控制、保护、数据采集与远程管理设计。核心功能涵盖发动机启停控制、转速与负载调节、发电机参数实时监测&#xff0c;集成过压、欠压、过…

作者头像 李华
网站建设 2026/6/2 11:42:57

确保AI生成的测试用例不重复的策略与实践

随着AI在软件测试领域的广泛应用&#xff0c;测试用例自动生成技术显著提升了效率&#xff0c;但同时也带来了重复用例泛滥的风险。重复用例不仅浪费执行资源&#xff0c;还可能导致关键场景覆盖不足&#xff0c;增加漏测概率。本文将从技术原理、优化策略和实践指南三个维度&a…

作者头像 李华
网站建设 2026/5/27 7:04:55

高频面试题:Java项目高并发下如何保证数据的一致性和可靠性?

大家好&#xff0c;我是锋哥。今天分享关于【高频面试题&#xff1a;Java项目高并发下如何保证数据的一致性和可靠性?】面试题。希望对大家有帮助&#xff1b;高频面试题&#xff1a;Java项目高并发下如何保证数据的一致性和可靠性?下面按常见场景和解决方案强度来系统性回答…

作者头像 李华