PKU1731-Order
题目大意
§
给一个字符串,长度不超过
200
个字符
§
求其不重复的全排列
§
输出不超过
2M
字节
思路
产生含重复元素的全排列
¡ 扩展一下 visit 数组的含义,让它记录各种元素和个数
¡ 扩展一下 visit 数组的含义,让它记录各种元素和个数
¡
当剩余的个数大于
0
时才发生递归
代码
#include <functional>
#include <algorithm>
#include <stdexcept>
#include <iostream>
#include <sstream>
#include <fstream>
#include <numeric>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <utility>
#include <cctype>
#include <vector>
#include <string>
#include <bitset>
#include <cmath>
#include <queue>
#include <stack>
#include <ctime>
#include <list>
#include <map>
#include <set>
#include <cstdio>
#include <deque>
using namespace std;
#define PB push_back
#define MP make_pair
#define FU(i,n) for(i=0;i<n;i++)
#define FD(i,n) for(i=n-1;i>=0;i--)
typedef vector<int> VI;
typedef vector<string> VS;
typedef vector<double> VD;
typedef pair<int,int> PII;
typedef long long LL;
typedef unsigned long long ULL;
pair<char,int> visit[200];
int cnt=0;
void stat(char *a,int n){
int i,j;
for(i=0;i<n;i++){
for(j=0;j<cnt&&visit[j].first!=a[i];j++);
if(j<cnt) visit[j].second++;
else{
visit[cnt].first = a[i];
visit[cnt].second = 1;
cnt++;
}
}
}
void per(char *a,int k,int n){
int i,j;
if(k==n){
puts(a);
}
else{
for(i=0;i<cnt;i++){
if(visit[i].second){
a[k] = visit[i].first;
visit[i].second--;
per(a,k+1,n);
visit[i].second++;
}
}
}
}
int main(){
int ca,n;
char a[200];
gets(a);
n = strlen(a);
sort(a,a+n);
stat(a,n);
per(a,0,n);
return 0;
}