传送门:poj 1146。
题意就是给你一串字符,让你求它字典序的下一种排列,找不到的话就输出“No Successor”,这里可以自己手写也可以直接用库函数next_permutation。
自己写的话找下一种排列的方法:
1.从后往前找到最大的非递增序列。
2.找到这个序列中最大的且比总序列中该序列(第一步找到的序列)的前一个字符小的字符。
3.对换找到的字符和总序列中该序列(第一步找到的序列)的前一个字符。
4.将对换后的该序列(第一步找到的序列)字典序排序。
/*#include<stdio.h>//使用库函数
#include<string.h>
#include<algorithm>
using namespace std;
char s[55];
int main()
{
while(~scanf("%s",s))
{
if(s[0]=='#')
break;
int len=strlen(s);
if(next_permutation(s,s+len))
printf("%s\n",s);
else
printf("No Successor\n");
memset(s,0,sizeof(s));
}
}*/
#include<stdio.h>//自己手写
#include<string.h>
#include<algorithm>
using namespace std;
char s[55];
int main()
{
while(scanf("%s",s))
{
if(s[0]=='#')
break;
int len=strlen(s);
int t=len-1;
int flag=1;
for(;t>=1;t--)
{
if(s[t-1]<s[t])
{
flag=0;
break;
}
}
if(flag)
{
printf("No Successor\n");
continue;
}
char f='z';
int temp;
for(int i=t;i<len;i++)
{
if(s[i]<f&&s[i]>s[t-1])
{
f=s[i];
temp=i;
}
}
s[temp]=s[t-1];
s[t-1]=f;
sort(s+t,s+len);
printf("%s\n",s);
memset(s,0,sizeof(s));
}
}