去重复的排列。
直接DFS。
然而WA三次,后来看题解才发现、、、这是个奇葩的字典序、、所以还要重写cmp比较函数。
1 /************************* 2 POJ 1256 3 728K 4 360MS 5 2015-06-27 6 By JimmyLin 7 *************************/ 8 #include<iostream> 9 #include<cstdio> 10 #include<cstring> 11 #include<string> 12 #include<algorithm> 13 14 using namespace std; 15 const int maxn=15; 16 int num[200]; 17 char a[maxn],ans[maxn]; 18 int tot; 19 20 void init() 21 { 22 memset(num,0,sizeof(num)); 23 memset(a,0,sizeof(a)); 24 memset(ans,0,sizeof(ans)); 25 tot=0; 26 } 27 void dfs(int x,int len) 28 { 29 if(x==len){ 30 ans[len]=‘\0‘; 31 printf("%s\n",ans); 32 return; 33 } 34 for(int i=0;i<tot;i++)if(num[a[i]]){ 35 ans[x]=a[i]; 36 num[a[i]]--; 37 dfs(x+1,len); 38 num[a[i]]++; 39 } 40 } 41 char touppercase(char a) 42 { 43 if(a>=‘a‘)return a-(‘a‘-‘A‘); 44 return a; 45 } 46 bool cmp(const char &a,const char &b) 47 { 48 if(‘A‘<=a&&‘A‘<=b&&‘Z‘>=a&&‘Z‘>=b||‘a‘<=a&&‘a‘<=b&&‘z‘>=a&&‘z‘>=b)return a<b; 49 if(abs(a-b)==abs(‘A‘-‘a‘))return a<=‘Z‘; 50 return touppercase(a)<touppercase(b); 51 } 52 int main() 53 { 54 int kase; 55 cin>>kase; 56 while(kase--){ 57 init(); 58 string s; 59 cin>>s; 60 for(int i=0;i<s.length();i++){ 61 if(!num[s[i]])a[tot++]=s[i]; 62 num[s[i]]++; 63 } 64 sort(a,a+tot,cmp); 65 dfs(0,s.length()); 66 } 67 return 0; 68 }
时间: 2024-12-27 22:32:00