Uva 10098 - Generating Fast

来源:互联网 发布:淘宝少女屎 编辑:程序博客网 时间:2024/05/17 06:30

生成字典序全排列

1Y

引用STL

#include<stdio.h>#include<string.h>#include<algorithm>int main(){char s[110];int t;scanf("%d",&t);while(t--){scanf("%s",s);int len=strlen(s);std::sort(s,s+len);do{printf("%s\n",s);}while(std::next_permutation(s,s+len));printf("\n");}return 0;}

看原理自己编写

给你一个序列28467186310

下一个排列是啥呢?

28467 是是前缀,不变的

看后面186310

找到3是1以后比1大的最小元素

变为

386110

然后反序

301168

接上就是了

#include<stdio.h>#include<string.h>#include<algorithm>#include<stdlib.h>#define INF (int)1e9char s[110];bool Next_per(){int len=strlen(s);int aim=INF;int i;for(i=len-1;i>0;i--){if(s[i]>s[i-1]){aim=i-1;break;}}if(aim==INF)return 0; for(i=len-1;i>aim;i--){if(s[i]>s[aim])break;}char t;t=s[i];s[i]=s[aim];s[aim]=t;int l=aim+1,r=len-1;while(l<r){t=s[l];s[l]=s[r];s[r]=t;l++;r--;}return 1;}int main(){int t;scanf("%d",&t);while(t--){ scanf("%s",s);int len=strlen(s);std::sort(s,s+len);do{printf("%s\n",s);}while(Next_per());printf("\n");}return 0;}