Repository navigation
Expand file tree
/
Copy pathclass_Partial_Permutation.cpp
More file actions
90 lines (87 loc) · 1.98 KB
/
Copy pathclass_Partial_Permutation.cpp
File metadata and controls
90 lines (87 loc) · 1.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include "auto_util_header.hpp"
template<typename val_t>
class Partial_Permutation {
private:
int n;
vector<bool> used;
vector<vector<val_t>> result;
vvi facts; // iPj
void core_func(const vector<val_t> &a, int n, int r, int start) {
if (r == 0 || n < r) return;
int m = facts[n - 1][r - 1];
int cnt = 0;
Loop(i, Partial_Permutation::n) {
if (!used[i]) {
Loop(j, m) {
result[start + m * cnt + j].push_back(a[i]);
}
used[i] = true;
core_func(a, n - 1, r - 1, start + m * cnt);
used[i] = false;
cnt++;
}
}
}
void make_facts(int n) {
facts = vvi(n + 1, vi(n + 1));
Loop(i, n + 1) {
facts[i][0] = 1;
Loop(j, i) {
facts[i][j + 1] = facts[i][j] * (i - j);
}
}
}
public:
vector<vector<val_t>> get_partial_permutation(const vector<val_t> &a, int r) {
n = int(a.size());
if (n < r) return {};
used = vector<bool>(n, false);
make_facts(n);
result = vector<vector<val_t>>(facts[n][r]);
core_func(a, n, r, 0);
return result;
}
};
class Partial_Permutation_String {
private:
int n;
string a;
vector<bool> used;
vector<string> result;
vvi facts; // iPj
void core_func(const string &a, int n, int r, int start) {
if (r == 0 || n < r) return;
int m = facts[n - 1][r - 1];
int cnt = 0;
Loop(i, Partial_Permutation_String::n) {
if (!used[i]) {
Loop(j, m) {
result[start + m * cnt + j] += a[i];
}
used[i] = true;
core_func(a, n - 1, r - 1, start + m * cnt);
used[i] = false;
cnt++;
}
}
}
void make_facts(int n) {
facts = vvi(n + 1, vi(n + 1));
Loop(i, n + 1) {
facts[i][0] = 1;
Loop(j, i) {
facts[i][j + 1] = facts[i][j] * (i - j);
}
}
}
public:
vector<string> get_partial_permutation(const string &a, int r) {
n = int(a.size());
if (n < r) return {};
used = vector<bool>(n, false);
make_facts(n);
result = vector<string>(facts[n][r]);
core_func(a, n, r, 0);
return result;
}
};