POJ1256

去重复的排列。

直接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

POJ1256的相关文章

poj1256 Anagram

Anagram Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18307   Accepted: 7452 Description You are to write a program that has to generate all possible words from a given set of letters. Example: Given the word "abc", your program s

poj1256(全排列stl)

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;bool cmp(char a,char b){ if(a>='A'&&a<='Z'&&b>='A'&&b<='Z') return a<b; if(a>='a'&&a<='z'&&b<='z'&a

[排列]poj1256

题意: 给出一个串,要求按照字典序输出所有排列. 分析: 直接利用STL 里的next_permutation()就好,重新定义一个cmp函数,没有把cmp放进next_permutation(),我都WA哭了... #include <cstdio> #include <cstring> #include <cmath> #include <iostream> #include <vector> #include <map> #in

poj1256(贪心+并查集)

题目链接:http://poj.org/problem?id=1456 题意:给n件商品的价格和卖出截至时间,每一个单位时间最多只能卖出一件商品,求能获得的最大利润. 思路:首先是贪心,为获得最大利润,优先考虑价格最高的,所以要按价格降序排列,另外每一件商品售出的时间应越后越好,比如a[i].p,a[i].d分别表示现在要售出的商品的价格和截止日期,则应该从a[i].d开始往前找不冲突的点,若找的点大于0,则卖出,若为0即表示因冲突无法卖出.并查集可以很好的实现这一要求,用root[i]表示第i

【转载】POJ水题大集合

POJ水题大集合 poj1000:A+B problempoj1002:电话上按键对应着数字.现在给n个电话,求排序.相同的归一类poj1003:求最小的n让1+1/2+1/3+...+1/n大于给的一个实数poj1004:求一堆实数的平均数poj1005:由坐标 (0,0) 开始,以半圆为形状每年侵蚀50m^2,问(0,0)开始到(x,y)结束需要多长时间poj1006:三个周期是常数.现在给三个周期出现高峰的时候,问下一次出现高峰是什么时候poj1007:求字符串排序poj1008:一种日历

poj练习题的方法

poj1010--邮票问题 DFSpoj1011--Sticks dfs + 剪枝poj1020--拼蛋糕poj1054--The Troublesome Frogpoj1062--昂贵的聘礼poj1077--Eightpoj1084--Square Destroyerpoj1085--Triangle War(博弈,極大極小搜索+alpha_beta剪枝)poj1088--滑雪poj1129--Channel Allocation 着色问题 dfspoj1154--letters (dfs)p

POJ 搜索题集

poj1010--邮票问题 DFS poj1011--Sticks dfs + 剪枝 poj1020--拼蛋糕 poj1054--The Troublesome Frog poj1062--昂贵的聘礼 poj1077--Eight poj1084--Square Destroyer poj1085--Triangle War(博弈,極大極小搜索+alpha_beta剪枝) poj1088--滑雪 poj1129--Channel Allocation 着色问题 dfs poj1154--lett