#include <iostream>
#include <string>
#include <cassert>
#include <climits>
#include <algorithm>
using namespace std;
bool isPermutation(std::string a, std::string b);
int main() {
string a;
a.push_back(0xE0);
a.push_back(0xA0);
a.push_back(0xA2);
// string should hold U+0822, SAMARITAN VOWEL SIGN LONG A
string b;
b.push_back(0xE0);
b.push_back(0xA2);
b.push_back(0xA0);
// string should hold U+08A0, ARABIC LETTER BEH WITH SMALL V BELOW
cout << a << '\n' << b << '\n';
cout << boolalpha << isPermutation(a, b) << '\n'; // Outputs true which is wrong!
cout << boolalpha << is_permutation(a.begin(), a.end(), b.begin(), b.end()) << '\n'; // Outputs true which is wrong!
string aa(a); sort(aa.begin(), aa.end());
string bb(b); sort(bb.begin(), bb.end());
cout << boolalpha << (aa == bb) << '\n'; // Outputs true which is wrong!
return 0;
}
bool isPermutation(std::string a, std::string b)
{
if(a.length() != b.length())
return false;
assert(a.length() <= INT_MAX);
assert(b.length() <= INT_MAX);
int counts[256] = {};
for (unsigned char ch : a)
++counts[ch];
for (unsigned char ch : b)
--counts[ch];
for (int count : counts)
if (count)
return false;
return true;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8Y2Fzc2VydD4KI2luY2x1ZGUgPGNsaW1pdHM+CiNpbmNsdWRlIDxhbGdvcml0aG0+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpib29sIGlzUGVybXV0YXRpb24oc3RkOjpzdHJpbmcgYSwgc3RkOjpzdHJpbmcgYik7CgppbnQgbWFpbigpIHsKCXN0cmluZyBhOwoJYS5wdXNoX2JhY2soMHhFMCk7CglhLnB1c2hfYmFjaygweEEwKTsKCWEucHVzaF9iYWNrKDB4QTIpOwoJLy8gc3RyaW5nIHNob3VsZCBob2xkIFUrMDgyMiwgU0FNQVJJVEFOIFZPV0VMIFNJR04gTE9ORyBBCgkKCXN0cmluZyBiOwoJYi5wdXNoX2JhY2soMHhFMCk7CgliLnB1c2hfYmFjaygweEEyKTsKCWIucHVzaF9iYWNrKDB4QTApOwoJLy8gc3RyaW5nIHNob3VsZCBob2xkIFUrMDhBMCwgQVJBQklDIExFVFRFUiBCRUggV0lUSCBTTUFMTCBWIEJFTE9XCgkKCWNvdXQgPDwgYSA8PCAnXG4nIDw8IGIgPDwgJ1xuJzsKCQoJY291dCA8PCBib29sYWxwaGEgPDwgaXNQZXJtdXRhdGlvbihhLCBiKSA8PCAnXG4nOyAvLyBPdXRwdXRzIHRydWUgd2hpY2ggaXMgd3JvbmchCgkKCWNvdXQgPDwgYm9vbGFscGhhIDw8IGlzX3Blcm11dGF0aW9uKGEuYmVnaW4oKSwgYS5lbmQoKSwgYi5iZWdpbigpLCBiLmVuZCgpKSA8PCAnXG4nOyAvLyBPdXRwdXRzIHRydWUgd2hpY2ggaXMgd3JvbmchCgkKCXN0cmluZyBhYShhKTsgc29ydChhYS5iZWdpbigpLCBhYS5lbmQoKSk7CiAgICBzdHJpbmcgYmIoYik7IHNvcnQoYmIuYmVnaW4oKSwgYmIuZW5kKCkpOwogICAgY291dCA8PCBib29sYWxwaGEgPDwgIChhYSA9PSBiYikgPDwgJ1xuJzsgLy8gT3V0cHV0cyB0cnVlIHdoaWNoIGlzIHdyb25nIQoJCglyZXR1cm4gMDsKfQoKCmJvb2wgaXNQZXJtdXRhdGlvbihzdGQ6OnN0cmluZyBhLCBzdGQ6OnN0cmluZyBiKQp7CiAgICBpZihhLmxlbmd0aCgpICE9IGIubGVuZ3RoKCkpCiAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIGFzc2VydChhLmxlbmd0aCgpIDw9IElOVF9NQVgpOwogICAgYXNzZXJ0KGIubGVuZ3RoKCkgPD0gSU5UX01BWCk7CgogICAgaW50IGNvdW50c1syNTZdID0ge307CiAgICBmb3IgKHVuc2lnbmVkIGNoYXIgY2ggOiBhKQogICAgICAgICsrY291bnRzW2NoXTsKICAgIGZvciAodW5zaWduZWQgY2hhciBjaCA6IGIpCiAgICAgICAgLS1jb3VudHNbY2hdOwogICAgZm9yIChpbnQgY291bnQgOiBjb3VudHMpCiAgICAgICAgaWYgKGNvdW50KQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgcmV0dXJuIHRydWU7Cn0K