#include <algorithm>
#include <array>
#include <ctime>
#include <iostream>
#include <random>
#include <vector>
#define PRECOMPUTE_RANDOM 1
bool isPermutation(const std::string &inputa, const std::string &inputb)
{
static const size_t MAX_CHAR = 256;
std::array<int, MAX_CHAR> allChars;
allChars.fill(0);
for (auto c : inputa)
++allChars[c];
for (auto c : inputb)
{
--allChars[c];
if (allChars[c] < 0)
return false;
}
return true;
}
bool isPermutationSort(const std::string& a, const std::string& b) {
return std::is_permutation(a.begin(), a.end(), b.begin());
}
int main()
{
const std::vector<std::string> bag
{
"god", "dog", "thisisaratherlongerinput", "thisisarathershorterinput",
"armen", "ramen"
};
const unsigned stop = 1000000;
#if !PRECOMPUTE_RANDOM
static std::mt19937 engine;
std::uniform_int_distribution<std::size_t> rand(0, bag.size() - 1);
#else
static size_t engine = 0;
static unsigned int evals[4 * stop];
{
static std::mt19937 engine;
std::uniform_int_distribution<std::size_t> rand(0, bag.size() - 1);
for(unsigned int i = 0; i < sizeof(evals)/sizeof(*evals); ++i)
evals[i] = rand(engine);
}
auto rand = [](size_t& engine) {
return evals[engine++];
};
#endif
unsigned counter = 0;
std::clock_t start = std::clock();
for (unsigned i(0); i < stop; ++i)
counter += isPermutation(bag[rand(engine)], bag[rand(engine)]);
double time = (clock() - start) / (double)CLOCKS_PER_SEC;
std::cout << counter << ": " << time << " s\n";
counter = 0;
start = std::clock();
for (unsigned i(0); i < stop; ++i)
counter += isPermutationSort(bag[rand(engine)], bag[rand(engine)]);
time = (clock() - start) / (double)CLOCKS_PER_SEC;
std::cout << counter << ": " << time << " s\n";
return 0;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGFycmF5PgojaW5jbHVkZSA8Y3RpbWU+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHJhbmRvbT4KI2luY2x1ZGUgPHZlY3Rvcj4KCiNkZWZpbmUgUFJFQ09NUFVURV9SQU5ET00gMQoKYm9vbCBpc1Blcm11dGF0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZpbnB1dGEsIGNvbnN0IHN0ZDo6c3RyaW5nICZpbnB1dGIpCnsKICBzdGF0aWMgY29uc3Qgc2l6ZV90IE1BWF9DSEFSID0gMjU2OwogIHN0ZDo6YXJyYXk8aW50LCBNQVhfQ0hBUj4gYWxsQ2hhcnM7CiAgYWxsQ2hhcnMuZmlsbCgwKTsKCiAgZm9yIChhdXRvIGMgOiBpbnB1dGEpCiAgICArK2FsbENoYXJzW2NdOwoKICBmb3IgKGF1dG8gYyA6IGlucHV0YikKICB7CiAgICAtLWFsbENoYXJzW2NdOwogICAgaWYgKGFsbENoYXJzW2NdIDwgMCkKICAgICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgcmV0dXJuIHRydWU7Cn0KCmJvb2wgaXNQZXJtdXRhdGlvblNvcnQoY29uc3Qgc3RkOjpzdHJpbmcmIGEsIGNvbnN0IHN0ZDo6c3RyaW5nJiBiKSB7CglyZXR1cm4gc3RkOjppc19wZXJtdXRhdGlvbihhLmJlZ2luKCksIGEuZW5kKCksIGIuYmVnaW4oKSk7Cn0KCmludCBtYWluKCkKewogIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBiYWcKICB7CiAgICAiZ29kIiwgImRvZyIsICJ0aGlzaXNhcmF0aGVybG9uZ2VyaW5wdXQiLCAidGhpc2lzYXJhdGhlcnNob3J0ZXJpbnB1dCIsCiAgICAiYXJtZW4iLCAicmFtZW4iCiAgfTsKCiAgY29uc3QgdW5zaWduZWQgc3RvcCA9IDEwMDAwMDA7CgojaWYgIVBSRUNPTVBVVEVfUkFORE9NCiAgc3RhdGljIHN0ZDo6bXQxOTkzNyBlbmdpbmU7CiAgc3RkOjp1bmlmb3JtX2ludF9kaXN0cmlidXRpb248c3RkOjpzaXplX3Q+IHJhbmQoMCwgYmFnLnNpemUoKSAtIDEpOwojZWxzZQogIHN0YXRpYyBzaXplX3QgZW5naW5lID0gMDsKICBzdGF0aWMgdW5zaWduZWQgaW50IGV2YWxzWzQgKiBzdG9wXTsKewogIHN0YXRpYyBzdGQ6Om10MTk5MzcgZW5naW5lOwogIHN0ZDo6dW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPHN0ZDo6c2l6ZV90PiByYW5kKDAsIGJhZy5zaXplKCkgLSAxKTsKICBmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgc2l6ZW9mKGV2YWxzKS9zaXplb2YoKmV2YWxzKTsgKytpKQogICAgZXZhbHNbaV0gPSByYW5kKGVuZ2luZSk7Cn0KICBhdXRvIHJhbmQgPSBbXShzaXplX3QmIGVuZ2luZSkgewogICAgcmV0dXJuIGV2YWxzW2VuZ2luZSsrXTsKICB9OwojZW5kaWYKCiAgdW5zaWduZWQgY291bnRlciA9IDA7CiAgc3RkOjpjbG9ja190IHN0YXJ0ID0gc3RkOjpjbG9jaygpOwogIGZvciAodW5zaWduZWQgaSgwKTsgaSA8IHN0b3A7ICsraSkKICAgIGNvdW50ZXIgKz0gaXNQZXJtdXRhdGlvbihiYWdbcmFuZChlbmdpbmUpXSwgYmFnW3JhbmQoZW5naW5lKV0pOwoKICBkb3VibGUgdGltZSA9IChjbG9jaygpIC0gc3RhcnQpIC8gKGRvdWJsZSlDTE9DS1NfUEVSX1NFQzsKICBzdGQ6OmNvdXQgPDwgY291bnRlciA8PCAiOiAiIDw8IHRpbWUgPDwgIiBzXG4iOwoKICBjb3VudGVyID0gMDsKICBzdGFydCA9IHN0ZDo6Y2xvY2soKTsKICBmb3IgKHVuc2lnbmVkIGkoMCk7IGkgPCBzdG9wOyArK2kpCiAgICBjb3VudGVyICs9IGlzUGVybXV0YXRpb25Tb3J0KGJhZ1tyYW5kKGVuZ2luZSldLCBiYWdbcmFuZChlbmdpbmUpXSk7CgogIHRpbWUgPSAoY2xvY2soKSAtIHN0YXJ0KSAvIChkb3VibGUpQ0xPQ0tTX1BFUl9TRUM7CiAgc3RkOjpjb3V0IDw8IGNvdW50ZXIgPDwgIjogIiA8PCB0aW1lIDw8ICIgc1xuIjsKCiAgcmV0dXJuIDA7Cn0K