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. OpenCV.Net基于傅里叶变换进行文本的旋转校正

    本文描述一种利用OpenCV及傅里叶变换识别图片中文本旋转角度并自动校正的方法,由于对C#比较熟,因此本文将使用OpenCVSharp. 文章参考了http://johnhany.net/2013/1 ...

  2. 十三道Python练习题

    一.完美立方 编写一个程序,对任给的正整数N (N≤100),寻找所有的四元组(a, b, c, d),使得a^3= b^3 + c^3 + d^3,其中a,b,c,d 大于 1, 小于等于N. 输入 ...

  3. Spring Boot 使用 Log4j2 & Logback 输出日志到 EKL

    文章目录 1.ELK 介绍 2.环境.软件准备 3.ELK 环境搭建 4.Spring Boot 配置示例 4.1.Log4j2 方式配置 4.2.Logback 方式配置 1.ELK 介绍 ELK ...

  4. Java自学-I/O 对象流

    Java 对象流 ObjectInputStream,ObjectOutputStream 对象流指的是可以直接把一个对象以流的形式传输给其他的介质,比如硬盘 一个对象以流的形式进行传输,叫做序列化. ...

  5. 详解JavaScript的任务、微任务、队列以及代码执行顺序

    摘要: 理解JS的执行顺序. 作者:前端小智 原文:详解JavaScript的任务.微任务.队列以及代码执行顺序 思考下面 JavaScript 代码: console.log("scrip ...

  6. Centos7安装宝塔控制面板

    目录 宝塔面板安装和使用图文教程 1,通过ssh工具登录服务器 2,安装宝塔面板 2,登录宝塔面板 3,设置宝塔面板 3.1,首先我们进入面板设置 3.2,更改面板端口 3.3,绑定域名 3.4,绑定 ...

  7. 操作Excel模块openpyxl

    安装 pip install openpyxl 想要在文件中插入图片文件,需要安装pillow font(字体类):字号.字体颜色.下划线等 fill(填充类):颜色等 border(边框类):设置单 ...

  8. 201871020225-牟星源《面向对象程序设计(java)》第十四周学习总结

    201871020225-牟星源<面向对象程序设计(java)>第十四周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  9. JVM 学习资料

    资料 网址 JVM Options - The complete reference http://jvm-options.tech.xebia.fr/ Java HotSpot VM Options ...

  10. djang小项目过程中的小问题 02(跳转界面)

    我觉着自己生下来就是解决问题的 ##1. 今天在使用登录注册模板时,输入后缀index,正常显示登录界面,但是点击 立即注册 之后不会跳转到注册页面 因为我观察到后缀名发生变化了,但是出发点是错的,前 ...