ID Codes
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 7644   Accepted: 4509

Description

It is 2084 and the year of Big Brother has finally arrived, albeit a century late. In order to exercise greater control over its citizens and thereby to counter a chronic breakdown in law and order, the Government decides on a radical measure--all citizens are to have a tiny microcomputer surgically implanted in their left wrists. This computer will contains all sorts of personal information as well as a transmitter which will allow people's movements to be logged and monitored by a central computer. (A desirable side effect of this process is that it will shorten the dole queue for plastic surgeons.)

An essential component of each computer will be a unique
identification code, consisting of up to 50 characters drawn from the 26
lower case letters. The set of characters for any given code is chosen
somewhat haphazardly. The complicated way in which the code is imprinted
into the chip makes it much easier for the manufacturer to produce
codes which are rearrangements of other codes than to produce new codes
with a different selection of letters. Thus, once a set of letters has
been chosen all possible codes derivable from it are used before
changing the set.

For example, suppose it is decided that a code will contain exactly 3
occurrences of `a', 2 of `b' and 1 of `c', then three of the allowable
60 codes under these conditions are:

      abaabc

abaacb

ababac

These three codes are listed from top to bottom in alphabetic order.
Among all codes generated with this set of characters, these codes
appear consecutively in this order.

Write a program to assist in the issuing of these identification
codes. Your program will accept a sequence of no more than 50 lower case
letters (which may contain repeated characters) and print the successor
code if one exists or the message `No Successor' if the given code is
the last in the sequence for that set of characters.

Input

Input
will consist of a series of lines each containing a string representing a
code. The entire file will be terminated by a line consisting of a
single #.

Output

Output will consist of one line for each code read containing the successor code or the words 'No Successor'.

Sample Input

abaacb
cbbaa
#

Sample Output

ababac
No Successor

题意:

首先会给定一个字符串,因为开发商要通过交换字母位置生成新的字符串来节约刻印这些字符串的成本,假设现在已经按字典序将所有可能的排列全部找出来了,问你当前给定的这个字符串的下一个排列(按照字典序)是什么?例如假定一个识别码有三个a,两个b,一个c,在满足条件的60个编码中按字典序选出三个是:abaabc,abaacb,ababac,现在题目给定的字符串是abaacb,那么按字典序来讲,下个字符串是ababac,输出"ababac"即可。

分析:

本题利用的是字典序思想来对字符串进行改造,也就是在不改变字母组成的情况下生成该字符串的下一个字典序排列(没有的话输出“No Successor”)。

解法:

1.从后往前先找出一个正序。(找不到的话就是No Successor)。

2.(记这个正序的下标分别是id-1,id)从找出的的那个正序的下标(id)开始往后遍历,找到最后一个大于s[id-1]且小于s[id]的那个元素(记下标为 j)。

3.swap(s[id-1],s[j]);交换这两个数来破坏原来的正序,又因为新找到的元素字典序大于s[id-1]所以交换以后的字典序一定更大。

4.sort(s+id,s+len);对从id到末尾的所有元素从小到大排序来保证我们新得出的这个字符串按字典序排序的结果是紧邻在原串之后的。

AC code:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char s[];
int solve()
{
int len=strlen(s);
int id=len-;
while(id>=)
{
if(s[id]>s[id-]) break;
else
{
id--;
}
}
if(id==) return ;
int mpre=id-,mnow=id;
for(int j=mnow+;j<len;j++)
{
if(s[j]<=s[mpre]) continue;
if(s[j]<s[mnow]) mnow=j;
}
swap(s[mnow],s[mpre]);
sort(s+id,s+len);
return ;
}
int main()
{
//freopen("input.txt","r",stdin);
while(~scanf("%s",s)&&s[]!='#')
{
if(solve()) printf("%s\n",s);
else printf("No Successor\n");
}
}

POJ 1146 ID Codes 用字典序思想生成下一个排列组合的更多相关文章

  1. POJ 1146 ID Codes (UVA146)

    // 求下一个排列// 如果已经是最后一个排列// 就输出 No Successor// stl 或 自己写个 生成排列 我测试了下 两个速率是一样的.只是代码长度不同 /* #include < ...

  2. poj 1146 ID Codes (字符串处理 生成排列组合 生成当前串的下一个字典序排列 【*模板】 )

    ID Codes Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6229   Accepted: 3737 Descript ...

  3. ACM POJ 1146 ID Codes

    题目大意:输入一个字符串.输出它的下一个字典序排列. 字典序算法思想: 1.从右向左寻找字符串找出第一个a[i]<a[i+1]的位置i; 2.从右向左找出第一个大于a[i]的元素a[j]; 3. ...

  4. 31. Next Permutation (java 字典序生成下一个排列)

    题目: Implement next permutation, which rearranges numbers into the lexicographically next greater per ...

  5. (组合数学3.1.1.1)POJ 1146 ID Codes(字典序法)

    /* * POJ_1146.cpp * * Created on: 2013年10月8日 * Author: Administrator */ #include <iostream> #i ...

  6. UVA 10098 用字典序思想生成所有排列组合

    题目: Generating permutation has always been an important problem in computer science. In this problem ...

  7. 1146 ID Codes

    题目链接: http://poj.org/problem?id=1146 题意: 给定一个字符串(长度不超过50), 求这个字符串的下一个字典序的字符串, 如果已经是最大字典序, 那么输出 " ...

  8. UVA 146 ID Codes(下一个排列)

    C - ID Codes Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Statu ...

  9. UVa-146 - ID Codes(下一个排列)

    /* ID Codes It is 2084 and the year of Big Brother has finally arrived, albeit a century late. In or ...

随机推荐

  1. Linux软件安装——安装软件的命令

    Linux软件安装——安装软件的命令 摘要:本文主要学习了如何在Linux系统中安装.更新.卸载软件. rpm命令 rpm命令用来在Linux系统上进行软件的安装. 基本语法 安装命令: rpm -i ...

  2. MySQL5.7增量备份恢复全实战

    一. 简介 1. 增量备份 增量备份是指在一次全备份或上一次增量备份后,以后每次的备份只需备份与前一次相比增加或者被修改的文件.这就意味着,第一次增量 备份的对象是进行全备后所产生的增加和修改的文件; ...

  3. 使用xkbeancomparator对比javabean,生成操作记录

    xkbeancomparator是一个 java bean 对比修改并输出差异的工具.github地址 适用场景:用户编辑提交时,需要记录修改内容,修改前后的值对比,生成操作记录:可以选择记录的字段和 ...

  4. Finished with error: ProcessException: Process "D:\FlutterAPP\flutter_appfive\android\gradlew.bat" exited abnormally:

    在使用Flutter进行开发是遇到这样一个问题 Finished with error: ProcessException: Process "D:\FlutterAPP\flutter_a ...

  5. springCloud搭建微服务集群+Zuul服务器端负载均衡

    概述 最近研究了一下springCloud的微服务集群,主要用到了SpringCloud的服务发现和服务器端负载均衡,所有的项目都是用的springboot,可以和springCloud无缝对接. 技 ...

  6. 谁有好的oracle数据库学习书籍,麻烦提供一下,感激不尽

    作为一个IT人员,想深入学习一下oracle,以前都只是懂基本的语法,CRUD 数据库设计,数据库优化,底层完全不懂,哪位仁兄有好的书籍可以推荐一下,感激不尽.

  7. [PHP] 使用ftell和fseek函数直接定位文件位置获取部分数据

    对于大文件只获取部分数据很有用 1.使用ftell函数可以获取当前指针的字节位置2.使用fseek函数可以直接定位到指定的位置3.读取指定字节的数据就可以部分获取文件内容了 <?php clas ...

  8. 关于宝塔一个站点绑定多个域名宝塔ssl证书的问题

    目前“宝塔SSL”自动申请绑定一个证书,即根域名和www域名,如果还需要绑定手机端m则需要绑定多个域名如果多域名绑定一个网站数据,需要新建多个站点指向同一文件目录. 用相同的方法,在不新建站点的前提下 ...

  9. vue-router路由传参之query和params

    首先简单来说明一下$router和$route的区别 //$router : 是路由操作对象,只写对象 //$route : 路由信息对象,只读对象 //操作 路由跳转 this.$router.pu ...

  10. Python Treelib 多叉树 数据结构 中文使用帮助文档

    树,对于计算机编程语言来说是一个重要的数据结构.它具有广泛的应用,比如文件系统的分层数据结构和机器学习中的一些算法.这里创建了treelib来提供Python中树数据结构的高效实现. 官方文档:htt ...