#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <unordered_set>
using namespace std;
void permutate_bt(vector<int>& v, vector<vector<int>>& res, const unsigned int l=0)
{
if(l==(v.size()-1)) {res.push_back(v); return;}
for(unsigned int i=l; i<v.size(); ++i)
{
iter_swap(v.begin()+i, v.begin()+l);
permutate_bt(v, res, l+1);
iter_swap(v.begin()+i, v.begin()+l);
}
}
void permutate_pf(const vector<int>& v, vector<vector<int>>& res, const unsigned int l=0)
{
if(l==(v.size())-1) { res.push_back(v); return; }
for(unsigned int i=l; i<v.size(); ++i)
{
auto t = v;
t.insert(t.begin(),v[i]);
t.erase(t.begin()+i+1);
permutate_pf(t, res, l+1);
}
}
string to_str(const vector<int>& v)
{
string res;
for(const auto& e : v) res += to_string(e) + " ";
return res;
}
string to_str(const vector<vector<int>>& v)
{
string res;
for(const auto& e : v) res += to_str(e) + "\n";
return res;
}
const vector<int> t = {1,2,3};
int main() {
// your code goes here
vector<vector<int>> res_bt;
vector<int> v = {1,2,3};
permutate_bt(v, res_bt);
unordered_set<string> gt;
for(const auto& e : res_bt) gt.insert(to_str(e));
vector<vector<int>> res_pf;
permutate_pf({1,2,3}, res_pf);
unsigned int count=0;
for(const auto& e : res_pf) if(gt.find(to_str(e)) != gt.end()) count++;
cout << "BT" << endl;
cout << to_str(res_bt) << endl;
cout << "PF" << endl;
cout << to_str(res_pf) << endl;
cout << "Found=" << count << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCgoKdm9pZCBwZXJtdXRhdGVfYnQodmVjdG9yPGludD4mIHYsIHZlY3Rvcjx2ZWN0b3I8aW50Pj4mIHJlcywgY29uc3QgdW5zaWduZWQgaW50IGw9MCkKewoJaWYobD09KHYuc2l6ZSgpLTEpKSB7cmVzLnB1c2hfYmFjayh2KTsgcmV0dXJuO30KCWZvcih1bnNpZ25lZCBpbnQgaT1sOyBpPHYuc2l6ZSgpOyArK2kpCgl7CgkJaXRlcl9zd2FwKHYuYmVnaW4oKStpLCB2LmJlZ2luKCkrbCk7IAoJCXBlcm11dGF0ZV9idCh2LCByZXMsIGwrMSk7IAoJCWl0ZXJfc3dhcCh2LmJlZ2luKCkraSwgdi5iZWdpbigpK2wpOyAKCX0KfQoKCgp2b2lkIHBlcm11dGF0ZV9wZihjb25zdCB2ZWN0b3I8aW50PiYgdiwgdmVjdG9yPHZlY3RvcjxpbnQ+PiYgcmVzLCBjb25zdCB1bnNpZ25lZCBpbnQgbD0wKQp7CglpZihsPT0odi5zaXplKCkpLTEpIHsgcmVzLnB1c2hfYmFjayh2KTsgcmV0dXJuOyB9Cglmb3IodW5zaWduZWQgaW50IGk9bDsgaTx2LnNpemUoKTsgKytpKQoJewoJCWF1dG8gdCA9IHY7IAoJCXQuaW5zZXJ0KHQuYmVnaW4oKSx2W2ldKTsgCgkJdC5lcmFzZSh0LmJlZ2luKCkraSsxKTsgCgkJcGVybXV0YXRlX3BmKHQsIHJlcywgbCsxKTsgCgl9Cn0KCgoKc3RyaW5nIHRvX3N0cihjb25zdCB2ZWN0b3I8aW50PiYgdikKewoJc3RyaW5nIHJlczsgCglmb3IoY29uc3QgYXV0byYgZSA6IHYpIHJlcyArPSB0b19zdHJpbmcoZSkgKyAiICI7IAoJcmV0dXJuIHJlczsgCn0KCnN0cmluZyB0b19zdHIoY29uc3QgdmVjdG9yPHZlY3RvcjxpbnQ+PiYgdikKewoJc3RyaW5nIHJlczsgCglmb3IoY29uc3QgYXV0byYgZSA6IHYpIHJlcyArPSB0b19zdHIoZSkgKyAiXG4iOyAKCXJldHVybiByZXM7Cn0KCgpjb25zdCB2ZWN0b3I8aW50PiB0ID0gezEsMiwzfTsgCgoKaW50IG1haW4oKSB7CgkvLyB5b3VyIGNvZGUgZ29lcyBoZXJlCgl2ZWN0b3I8dmVjdG9yPGludD4+IHJlc19idDsKCXZlY3RvcjxpbnQ+IHYgPSB7MSwyLDN9OyAKCXBlcm11dGF0ZV9idCh2LCByZXNfYnQpOwoJCgl1bm9yZGVyZWRfc2V0PHN0cmluZz4gZ3Q7IAoJZm9yKGNvbnN0IGF1dG8mIGUgOiByZXNfYnQpIGd0Lmluc2VydCh0b19zdHIoZSkpOyAKCQoJdmVjdG9yPHZlY3RvcjxpbnQ+PiByZXNfcGY7IAoJcGVybXV0YXRlX3BmKHsxLDIsM30sIHJlc19wZik7IAoJCgl1bnNpZ25lZCBpbnQgY291bnQ9MDsgCglmb3IoY29uc3QgYXV0byYgZSA6IHJlc19wZikgaWYoZ3QuZmluZCh0b19zdHIoZSkpICE9IGd0LmVuZCgpKSBjb3VudCsrOyAKCQoJY291dCA8PCAiQlQiIDw8IGVuZGw7IAoJY291dCA8PCB0b19zdHIocmVzX2J0KSA8PCBlbmRsOyAKCQoJY291dCA8PCAiUEYiIDw8IGVuZGw7IAoJY291dCA8PCB0b19zdHIocmVzX3BmKSA8PCBlbmRsOyAKCQoJY291dCA8PCAiRm91bmQ9IiA8PCBjb3VudCA8PCBlbmRsOyAKCXJldHVybiAwOwp9