首页 技术 正文
技术 2022年11月17日
0 收藏 559 点赞 3,550 浏览 3627 个字

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

这道题是要输出给定字符串的字典顺序的下一个,假设没有下一个。则输出No Successor。

字典序例如以下:

设P是1~n的一个全排列:p=p1p2……pn=p1p2……pj-1pjpj+1……pk-1pkpk+1……pn

1)从排列的右端開始。找出第一个比右边数字小的数字的序号j(j从左端開始计算)。即 j=max { i | pi < pi+ 1}

2)在pj的右边的数字中。找出全部比pj大的数中最小的数字pk,即 k=max{i|pi>pj}(右边的数从右至左是递增的,因此k是全部大于pj的数字中序号最大者)

3)对换pj,pk

4)再将pj+1……pk-1pkpk+1……pn倒转得到排列p’=p1p2…..pj-1pjpn…..pk+1pkpk-1…..pj+1。这就是排列p的下一个排列。

上面这一段话摘自百度百科,之前的理解仅仅是知道例如说 123

字典顺序就是

1 2 3

1 3 2

2 1 3

2 3 1

3 1 2

3 2 1

但依据上面的方法事实上就能够写出求下一个字典顺序的字符串了。12345是起始,54321是终止。

例如说:13254

想找下一个字典顺序,找符合大小关系的。

发现5>4,pass。

2<5,perfect。

就是2了,从2这里入手。

之后仅仅须要在后面的5 4 中找一个比2大的最小的数,对换。

此时序列变为1 3 4 5 2。

再然后,对4后面的序列,进行正常从小到大排列。就是要找的下一个字典排序。

1 3 4 2 5。

所以,能够直接依据这个思想。写出代码

#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;int front,behind;
string a;bool find()
{
int len =a.length()-1;
while(len>0)
{
if(a[len-1] >= a[len])
{
}
else
{
front = len-1;
return true;
}
len--;
}
return false;
}void change()
{
int len =a.length()-1;
int min=200; while(len>front)
{
if(a[len]>a[front]&&(int)a[len]<min)
{
min=len;
}
len--;
}
char temp=a[min];
a[min]=a[front];
a[front]=temp;
}void sort()
{
int len = a.length();
int i,j;
char temp; for(i=front+1;i<len;i++)
{
for(j=i;j<len;j++)
{
if(a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
}int main()
{
while(cin>>a&&a!="#")
{
if(find())
{
change();
sort();
cout<<a<<endl;
}
else
{
cout<<"No Successor"<<endl;
}
}
return 0;
}

当然这个题,在algorithm.h文件里,有直接能够使用的字典顺序的函数next_permutation(),详细代码例如以下

#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;int main()
{
string a;
while(cin>>a&&a!="#")
{
if(next_permutation(a.begin(),a.end()))
{
cout<<a<<endl;
}
else
{
cout<<"No Successor"<<endl;
}
}
return 0;
}

这里面的next_permutation()函数就是求其下一个字典顺序。和prev_permutation()函数相相应,使用使用方法有一些像sort函数。能够对int数组 ,char数组,string类型进行字典顺序查找。也能够在第三个參数加上cmp函数。自己自己定义的一个排序函数。详细使用方法能够參考POJ 1256这道题,体现的比較明显。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,484
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,899
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,732
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,485
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,125
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,285