ограничение по памяти на тест256 мегабайт
Сегодня на спецкурсе «Строки» Геральд узнал новое определение эквивалентности строк. Две строки a и b равной длины называются эквивалентными в одном из двух случаев:

Они равны.
Если разделить строку a на две одинаковые по длине половины a1 и a2, а строку b — на две одинаковые по длине половины b1 и b2, то окажется, что верно одно из двух:
a1 эквивалентно b1, а a2 эквивалентно b2
a1 эквивалентно b2, а a2 эквивалентно b1
В качестве домашнего задания преподаватель выдал ученикам две строки и попросил определить, эквиваленты ли они.

Геральд уже сделал это домашнее задание. Сделайте и вы!

Входные данные
В первых двух строках входных данных даны две строки, которые выдал преподаватель. Каждая из них имеет длину от 1 до 200 000 и состоит из строчных букв английского алфавита. Строки имеют одинаковую длину.

Выходные данные
Выведите «YES» (без кавычек), если эти две строки эквивалентны, и «NO» (без кавычек) в противном случае.

Примеры
Входные данныеСкопировать
aaba
abaa
Выходные данныеСкопировать
YES
Входные данныеСкопировать
aabb
abab
Выходные данныеСкопировать
NO
Примечание
В первом примере первую строку можно разделить на строки "aa" и "ba", вторую – на строки "ab" и "aa". "aa" эквивалентно "aa"; "ab" эквивалентно "ba", так как "ab" = "a" + "b", "ba" = "b" + "a".

Во втором примере первую строку можно разделить на строки "aa" и "bb", которые эквивалентны только сами себе. Поэтому строка "aabb" эквивалентна только сама себе и строке "bbaa".

;


я сейчас дам свой код скажи что в нем не так 
#include <bits/stdc++.h>
using namespace std;

// #pragma GCC optimize("Ofast, unroll-loops")
// #pragma GCC target("avx2,fma")
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,sse4a,abm,mmx,avx,popcnt,tune=native")

#define int long long
using ll = int;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using vi = vector<int>;
using vll = vector<ll>;
using vb = vector<bool>;
using vpii = vector<pii>;
using vs = vector<string>;

#define cupsize                       \
    ios_base::sync_with_stdio(false); \
    cin.tie(nullptr);                 \
    cout.tie(nullptr);
#define pb push_back
#define st first
#define nd second
#define all(x) x.begin() + 1, x.end()
#define sz(x) (ll) x.size()
#define watch(x) (cout << #x << " == " << x << '\n')

const int maxn = 2e5 + 7;
const int maxn2 = 1e5 + 7;
const int mod = 1e9 + 7;
const int mod2 = (119 << 23) + 1; // 998244353
const int inf = 1e18;
const int iinf = 1e9;
const double eps = 1e-7;
const int block = 350;

void mtests(auto x)
{
    int tests;
    cin >> tests;
    while (tests--)
    {
        x();
    }
}

template <typename T>
void readv(vector<T> &v, int from = 0)
{
    for (size_t i = from; i < v.size(); ++i)
    {
        cin >> v[i];
    }
}

template <typename T>
void printv(vector<T> &v, int from = 0)
{
    for (size_t i = from; i < v.size(); ++i)
    {
        cout << v[i] << ' ';
    }
}

void precalc()
{
}

string s, x;
vector<string> t(4 * maxn);
vector<string> t2(4 * maxn);

void build(int v, int tl, int tr)
{
    if (tl == tr)
    {
        t[v].pb(s[tr - 1]);
        return;
    }
    int tm = (tl + tr) / 2;
    build(2 * v, tl, tm);
    build(2 * v + 1, tm + 1, tr);
    int p = 0;
    int p2 = 0;
    while (p <= t[2 * v].size() - 1 && p2 <= t[2 * v + 1].size() - 1)
    {
        if (t[2 * v][p] <= t[2 * v + 1][p2])
        {
            t[v].pb(t[2 * v][p]);
            p++;
        }
        else
        {
            t[v].pb(t[2 * v + 1][p2]);
            p2++;
        }
    }
    while (p < t[2 * v].size())
    {
        t[v].pb(t[2 * v][p]);
        p++;
    }
    while (p2 < t[2 * v + 1].size())
    {
        t[v].pb(t[2 * v + 1][p2]);
        p2++;
    }
}

void buildq(int v, int tl, int tr)
{
    if (tl == tr)
    {
        t2[v].pb(x[tr - 1]);
        return;
    }
    int tm = (tl + tr) / 2;
    buildq(2 * v, tl, tm);
    buildq(2 * v + 1, tm + 1, tr);
    int p = 0;
    int p2 = 0;
    while (p <= t2[2 * v].size() - 1 && p2 <= t2[2 * v + 1].size() - 1)
    {
        if (t2[2 * v][p] <= t2[2 * v + 1][p2])
        {
            t2[v].pb(t2[2 * v][p]);
            p++;
        }
        else
        {
            t2[v].pb(t2[2 * v + 1][p2]);
            p2++;
        }
    }
    while (p < t2[2 * v].size())
    {
        t2[v].pb(t2[2 * v][p]);
        p++;
    }
    while (p2 < t2[2 * v + 1].size())
    {
        t2[v].pb(t2[2 * v + 1][p2]);
        p2++;
    }
}

void solve()
{
    cin >> s >> x;
    int n = s.size();
    build(1, 1, n);
    buildq(1, 1, n);

    if (n % 2 == 1)
    {
        cout << "NO";
        return;
    }

    if (t[2] == t2[2] && t[3] == t2[3])
    {
        cout << "YES";
    }
    else if (t[2] == t2[3] && t[3] == t2[2])
    {
        cout << "YES";
    }
    else
    {
        cout << "NO";
    }
}

int32_t main()
{
    cupsize;
    precalc();
    // mtests(solve);
    solve();
}