题意:按照它规定的字典序 'A'<'a'<'B'<'b'<...<'Z'<'z'. 对一个字符串,输出它的全排列。
思路:学会使用next_permutation()中cmp自定义,全排列的规则。以前只知道sort()可以cmp重新定义,排序的标准,今天补充next_premutation也有。
注意这里,定义 大写字母字典序小于小写字母,所以cmp函数当地一个参数为小写字母时,不能取等于号。
#include <fstream> #include <iostream> #include <string> #include <cstring> #include <complex> #include <math.h> #include <set> #include <vector> #include <map> #include <queue> #include <stdio.h> #include <stack> #include <algorithm> #include <list> #include <ctime> #include <ctime> #include <assert.h> #define rep(i,a,n) for (int i=a;i<n;i++) #define per(i,a,n) for (int i=n-1;i>=a;i--) #define pb push_back #define mp make_pair #define all(x) (x).begin(),(x).end() #define fi first #define se second #define eps 1e-8 #define M_PI 3.141592653589793 typedef long long ll; const ll mod=1000000007; const int inf=0x7fffffff; ll powmod(ll a,ll b) {ll res=1;a%=mod;for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;} char a[50]; using namespace std; bool cmp(char a,char b) { if((a>='a'&&a<='z'&&b>='a'&&b<='z')||(a>='A'&&a<='Z'&&b>='A'&&b<='Z')) return a<b; else if(a>='a'&&a<='z'&&b>='A'&&b<='Z') return a<b+32; else if(a>='A'&&a<='Z'&&b>='a'&&b<='z') return a+32<=b; } int main() { int n;scanf("%d",&n); while(n--){ scanf("%s",a); int len=strlen(a); sort(a,a+len,cmp); cout<<a<<endl; while(next_permutation(a,a+len,cmp)){ cout<<a<<endl; } } }