UVA - 146 - ID Codes (枚举排列)

UVA - 146

ID Codes

Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu

Submit Status

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 and Output

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 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

Source

Root :: Competitive Programming: Increasing the Lower Bound of Programming Contests (Steven & Felix Halim) :: Chapter 2. Data Structures and Libraries :: Data Structures With Built-in Libraries :: STL
algorithm

Root :: Competitive Programming 2: This increases the lower bound of Programming Contests. Again (Steven & Felix Halim) :: Data Structures and Libraries :: Linear Data Structures with Built-in Libraries :: C++
STL algorithm (Java Collections)

Root :: AOAPC I: Beginning Algorithm Contests (Rujia Liu) :: Volume 3. Brute Force :: Elementary
Skills

Root :: Competitive Programming 3: The New Lower Bound of Programming Contests (Steven & Felix Halim) :: Data Structures and Libraries :: Linear Data Structures with Built-in Libraries ::C++
STL algorithm (Java Collections)

Submit Status

思路:STL中next_permutation的使用,生成当前序列按照字典序排列的的下一个序列,对于字符串也可以,对于可重集也行,要注意:就这个题目而言,如果当前序列是最后一个序列的话,就输出No Successor,所以用next_permutation之前还要判断一下是否是最后一个序列。

AC代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;

char str[55];

int fun(char a[]) {
	int len = strlen(a);
	for(int i = 0; i < len - 1; i++) {
		if(a[i] < a[i + 1]) return 1;
	}
	return 0;
}

int main() {
	while(scanf("%s", str), str[0] != '#') {
		int len = strlen(str);
		if(fun(str)) {
			next_permutation(str, str + len);
			printf("%s\n", str);
		}
		else printf("No Successor\n");
	}
	return 0;
} 

更新:原来next_permutation本身可以判断是否到了最后一个按照字典序排列的序列,所以直接用next_permutation即可

AC代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;

char str[55];

int main() {
	while(scanf("%s", str), str[0] != '#') {
		int len = strlen(str);
		if(next_permutation(str, str + len))
			printf("%s\n", str);
		else printf("No Successor\n");
	}
	return 0;
} 
时间: 2024-10-24 01:13:34

UVA - 146 - ID Codes (枚举排列)的相关文章

UVA 146 ID Codes(下一个排列)

C - ID Codes Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Appoint description:  System Crawler  (2014-05-12) Description  ID Codes  It is 2084 and the year of Big Brother has finally arrived, albeit a century l

Brute Force &amp; STL --- UVA 146 ID Codes

 ID Codes  Problem's Link:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=3&problem=82&mosmsg=Submission+received+with+ID+14418598 Mean: 求出可重排列的下一个排列. analyse: 直接用STL来实现就可.自己手动写了一个,并不复杂.

uva 146 ID Codes(求下一个排列)水水水

分别利用STL中的next_permutation和它的实现原理来写: next_permutation: <span style="font-family:Courier New;font-size:18px;">#include<stdio.h> #include<stdlib.h> #include<string.h> #include<algorithm> using namespace std; int main()

UVA 146 ID Codes

求用这些字母的下一个排列是什么.直接使用C++ STL库里面的next_permutation #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int main() { char s[1000]; while (~scanf("%s", s)) { if (strcmp(s, "#") == 0) break; int y =

UVA 146 ID code(next_permutation的运用)

ID code 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

UVa 146 ID码

题意:输出一个排列的后继排列,如果是最大的降序排列,则输出没有后继. 思路:调用STL中的next_permutation()函数即可.不过这个函数在求后继时是一个循环状态,即全升序是全降序的后继,循环回来了.所以在调用之前判断一下是否为全降序序列即可.       感觉用这个函数没什么技术含量,有时间用纯C写一个. Code: #include<cstdio> #include<algorithm> #include<cstring> using namespace

POJ 1146:ID Codes

ID Codes Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6281 Accepted: 3769 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

寒假集训.ID Codes

ID Codes Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Description  ID Codes  It is 2084 and the year of Big Brother has finally arrived, albeit a century late. In order to exercise greater control over its citi

蓝桥杯 2014本科C++ B组 六角填数 枚举排列

标题:六角填数 如图[1.png]所示六角形中,填入1~12的数字. 使得每条直线上的数字之和都相同. 图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少? 请通过浏览器提交答案,不要填写多余的内容. 简单的枚举排列,只要提前将12个结点标号,来判断六个线段总和是否相等. 代码如下: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define MAXN 13 5 int num