ID Codes(poj 1146)

来源:互联网 发布:投标报价软件 编辑:程序博客网 时间:2024/05/21 09:06

传送门: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);elseprintf("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));}}  


0 0
原创粉丝点击