#include <functional>
#include <iostream>
bool isVowel(unsigned char x)
{
static char vowelTest[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
return vowelTest[x];
}
bool isConst(unsigned char x)
{
return !isVowel(x);
}
char* findNext(char* data, std::function<bool(unsigned char)> test)
{
while(!test(*data))
{ ++data;
}
return data;
}
void rearange(char* str)
{
char* data[2] = { findNext(str, isConst), findNext(str, isVowel)};
bool vowelNow = false;
while(*str)
{
if (data[vowelNow] == str)
{
data[vowelNow] = findNext(data[vowelNow]+1, isVowel);
}
else
{
std::swap(*data[0], *data[1]);
data[0] = findNext(data[0]+1, isConst);
data[1] = findNext(data[1]+1, isVowel);
}
++str;
vowelNow = !vowelNow;
}
}
int main()
{
char val[] = "abed";
std::cout << val << "\n";
rearange(val);
std::cout << val << "\n";
}
CiNpbmNsdWRlIDxmdW5jdGlvbmFsPgojaW5jbHVkZSA8aW9zdHJlYW0+Cgpib29sIGlzVm93ZWwodW5zaWduZWQgY2hhciB4KQp7CiAgICBzdGF0aWMgY2hhciB2b3dlbFRlc3RbXSA9IHsKICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCiAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAogICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCiAgICAgICAgICAgICAgICAwLCAxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAxLAogICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKICAgICAgICAgICAgICAgIDAsIDEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDEsCiAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAogICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCiAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAogICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCiAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAogICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OwoKICAgIHJldHVybiB2b3dlbFRlc3RbeF07Cn0KYm9vbCBpc0NvbnN0KHVuc2lnbmVkIGNoYXIgeCkKewogICAgcmV0dXJuICFpc1Zvd2VsKHgpOwp9CmNoYXIqIGZpbmROZXh0KGNoYXIqIGRhdGEsIHN0ZDo6ZnVuY3Rpb248Ym9vbCh1bnNpZ25lZCBjaGFyKT4gdGVzdCkKewogICAgd2hpbGUoIXRlc3QoKmRhdGEpKQogICAgeyAgICsrZGF0YTsKICAgIH0KICAgIHJldHVybiBkYXRhOwp9CnZvaWQgcmVhcmFuZ2UoY2hhciogc3RyKQp7CiAgICBjaGFyKiAgIGRhdGFbMl0gICAgID0geyBmaW5kTmV4dChzdHIsIGlzQ29uc3QpLCBmaW5kTmV4dChzdHIsIGlzVm93ZWwpfTsKICAgIGJvb2wgICAgdm93ZWxOb3cgICAgPSBmYWxzZTsKCiAgICB3aGlsZSgqc3RyKQogICAgewogICAgICAgIGlmIChkYXRhW3Zvd2VsTm93XSA9PSBzdHIpCiAgICAgICAgewogICAgICAgICAgICBkYXRhW3Zvd2VsTm93XSAgICAgICA9IGZpbmROZXh0KGRhdGFbdm93ZWxOb3ddKzEsIGlzVm93ZWwpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBzdGQ6OnN3YXAoKmRhdGFbMF0sICpkYXRhWzFdKTsKICAgICAgICAgICAgZGF0YVswXSAgICAgPSBmaW5kTmV4dChkYXRhWzBdKzEsIGlzQ29uc3QpOwogICAgICAgICAgICBkYXRhWzFdICAgICA9IGZpbmROZXh0KGRhdGFbMV0rMSwgaXNWb3dlbCk7CiAgICAgICAgfQogICAgICAgICsrc3RyOwogICAgICAgIHZvd2VsTm93ICAgID0gIXZvd2VsTm93OwogICAgfQp9CgppbnQgbWFpbigpCnsKICAgIGNoYXIgdmFsW10gPSAiYWJlZCI7CiAgICBzdGQ6OmNvdXQgPDwgdmFsIDw8ICJcbiI7CiAgICByZWFyYW5nZSh2YWwpOwogICAgc3RkOjpjb3V0IDw8IHZhbCA8PCAiXG4iOwp9Cg==