#include <bits/stdc++.h>
using namespace std;
// Recursive function to calculate factorial of a number
int factorial(int n)
{
return (n <= 2) ? n : n * factorial(n - 1);
}
// Function to find Lexicographic rank of a string using
// std::prev_permutation
int findLexicographicRank(string key)
{
string str = key;
// sort the string in descending order
sort(str.rbegin(), str.rend());
int rank = factorial(str.length()); // maximum rank is n!
while(1)
{
// if current permutation is equal to the key, return its rank
if (key == str)
return rank;
// find next lexicographically ordered permutation
if (!prev_permutation(str.begin(), str.end()))
break;
rank--;
}
}
int main()
{
string key = "DCBA";
cout << "Lexicographic Rank of " << key << " is "
<< findLexicographicRank(key);
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyBSZWN1cnNpdmUgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIGZhY3RvcmlhbCBvZiBhIG51bWJlcgppbnQgZmFjdG9yaWFsKGludCBuKQp7CglyZXR1cm4gKG4gPD0gMikgPyBuIDogbiAqIGZhY3RvcmlhbChuIC0gMSk7Cn0KCi8vIEZ1bmN0aW9uIHRvIGZpbmQgTGV4aWNvZ3JhcGhpYyByYW5rIG9mIGEgc3RyaW5nIHVzaW5nIAovLyBzdGQ6OnByZXZfcGVybXV0YXRpb24KaW50IGZpbmRMZXhpY29ncmFwaGljUmFuayhzdHJpbmcga2V5KQp7CglzdHJpbmcgc3RyID0ga2V5OwoKCS8vIHNvcnQgdGhlIHN0cmluZyBpbiBkZXNjZW5kaW5nIG9yZGVyCglzb3J0KHN0ci5yYmVnaW4oKSwgc3RyLnJlbmQoKSk7CgoJaW50IHJhbmsgPSBmYWN0b3JpYWwoc3RyLmxlbmd0aCgpKTsJCS8vIG1heGltdW0gcmFuayBpcyBuIQoKCXdoaWxlKDEpCgl7CgkJLy8gaWYgY3VycmVudCBwZXJtdXRhdGlvbiBpcyBlcXVhbCB0byB0aGUga2V5LCByZXR1cm4gaXRzIHJhbmsKCSAJaWYgKGtleSA9PSBzdHIpCgkgCQlyZXR1cm4gcmFuazsKCQkKCQkvLyBmaW5kIG5leHQgbGV4aWNvZ3JhcGhpY2FsbHkgb3JkZXJlZCBwZXJtdXRhdGlvbgoJIAlpZiAoIXByZXZfcGVybXV0YXRpb24oc3RyLmJlZ2luKCksIHN0ci5lbmQoKSkpCgkgCQlicmVhazsKCgkgCXJhbmstLTsKCX0KfQoKaW50IG1haW4oKQp7CglzdHJpbmcga2V5ID0gIkRDQkEiOwoJCgljb3V0IDw8ICJMZXhpY29ncmFwaGljIFJhbmsgb2YgIiA8PCBrZXkgPDwgIiBpcyAiIAoJCQk8PCBmaW5kTGV4aWNvZ3JhcGhpY1Jhbmsoa2V5KTsKCQoJcmV0dXJuIDA7Cn0K