Problem p00949 (C++) — buggy submission, verdict: Memory Limit Exceeded

#include <algorithm> // other
#include <bitset>
#include <cassert> // c
#include <complex>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream> // io
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <regex>
#include <set>
#include <sstream>
#include <stack>
#include <vector> // container
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;

#define ALL(c) c.begin(), c.end()
#define IN(l, v, r) (l <= v && v < r)
template <class T> void UNIQUE(T &v) { v.erase(unique(ALL(v)), v.end()); }
// debug
#define DUMP(x) cerr << #x << " = " << (x)
#define LINE() cerr << " (L" << __LINE__ << ")"

struct range {
  struct Iter {
    int v, step;
    Iter &operator++() {
      v += step;
      return *this;
    }
    bool operator!=(Iter &itr) { return v < itr.v; }
    int &operator*() { return v; }
  };
  Iter i, n;
  range(int i, int n, int step) : i({i, step}), n({n, step}) {}
  range(int i, int n) : range(i, n, 1) {}
  range(int n) : range(0, n) {}
  Iter &begin() { return i; }
  Iter &end() { return n; }
};
struct rrange {
  struct Iter {
    int v, step;
    Iter &operator++() {
      v -= step;
      return *this;
    }
    bool operator!=(Iter &itr) { return v > itr.v; }
    int &operator*() { return v; }
  };
  Iter i, n;
  rrange(int i, int n, int step) : i({i - 1, step}), n({n - 1, step}) {}
  rrange(int i, int n) : rrange(i, n, 1) {}
  rrange(int n) : rrange(0, n) {}
  Iter &begin() { return n; }
  Iter &end() { return i; }
};

// input
template <typename T1, typename T2>
istream &operator>>(istream &is, pair<T1, T2> &p) {
  return is >> p.first >> p.second;
}
template <typename T1> istream &operator>>(istream &is, tuple<T1> &t) {
  return is >> get<0>(t);
}
template <typename T1, typename T2>
istream &operator>>(istream &is, tuple<T1, T2> &t) {
  return is >> get<0>(t) >> get<1>(t);
}
template <typename T1, typename T2, typename T3>
istream &operator>>(istream &is, tuple<T1, T2, T3> &t) {
  return is >> get<0>(t) >> get<1>(t) >> get<2>(t);
}
template <typename T1, typename T2, typename T3, typename T4>
istream &operator>>(istream &is, tuple<T1, T2, T3, T4> &t) {
  return is >> get<0>(t) >> get<1>(t) >> get<2>(t) >> get<3>(t);
}
template <typename T> istream &operator>>(istream &is, vector<T> &as) {
  for (int i : range(as.size()))
    is >> as[i];
  return is;
}
// output
template <typename T> ostream &operator<<(ostream &os, const set<T> &ss) {
  for (auto a : ss) {
    if (a != ss.begin())
      os << " ";
    os << a;
  }
  return os;
}
template <typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &p) {
  return os << p.first << " " << p.second;
}
template <typename K, typename V>
ostream &operator<<(ostream &os, const map<K, V> &m) {
  bool isF = true;
  for (auto &p : m) {
    if (!isF)
      os << endl;
    os << p;
    isF = false;
  }
  return os;
}
template <typename T1> ostream &operator<<(ostream &os, const tuple<T1> &t) {
  return os << get<0>(t);
}
template <typename T1, typename T2>
ostream &operator<<(ostream &os, const tuple<T1, T2> &t) {
  return os << get<0>(t) << " " << get<1>(t);
}
template <typename T1, typename T2, typename T3>
ostream &operator<<(ostream &os, const tuple<T1, T2, T3> &t) {
  return os << get<0>(t) << " " << get<1>(t) << " " << get<2>(t);
}
template <typename T1, typename T2, typename T3, typename T4>
ostream &operator<<(ostream &os, const tuple<T1, T2, T3, T4> &t) {
  return os << get<0>(t) << " " << get<1>(t) << " " << get<2>(t) << " "
            << get<3>(t);
}
template <typename T> ostream &operator<<(ostream &os, const vector<T> &as) {
  for (int i : range(as.size())) {
    if (i != 0)
      os << " ";
    os << as[i];
  }
  return os;
}
template <typename T>
ostream &operator<<(ostream &os, const vector<vector<T>> &as) {
  for (int i : range(as.size())) {
    if (i != 0)
      os << endl;
    os << as[i];
  }
  return os;
}

// values
template <typename T> inline T INF() { assert(false); };
template <> inline int INF<int>() { return 1 << 28; };
template <> inline ll INF<ll>() { return 1LL << 58; };
template <> inline double INF<double>() { return 1e16; };
template <> inline long double INF<long double>() { return 1e16; };

template <class T> inline T EPS() { assert(false); };
template <> inline int EPS<int>() { return 1; };
template <> inline ll EPS<ll>() { return 1LL; };
template <> inline double EPS<double>() { return 1e-8; };
template <> inline long double EPS<long double>() { return 1e-10; };

// min{2^r | n < 2^r}
template <typename T> T upper_pow2(T n) {
  T res = 1;
  while (res < n)
    res <<= 1;
  return res;
}
// max{d | 2^d  <= n}
template <typename T> T msb(T n) {
  int d = 62;
  while ((1LL << d) > n)
    d--;
  return d;
}

template <typename T, typename U> T pmod(T v, U M) { return (v % M + M) % M; }

class Main {
public:
  void run() {
    string s1, s2;
    cin >> s1 >> s2;

    int Mv = 0;
    for (int len : range(1, min(s1.size(), s2.size()) + 1)) {
      set<vector<int>> sm1;

      vector<int> cs(26);
      for (int i : range(len - 1))
        cs[s1[i] - 'a']++;
      for (int l : range(s1.size())) {
        int r = l + len;
        if (r < s1.size() + 1) {
          cs[s1[r - 1] - 'a']++;
          if (l >= 1)
            cs[s1[l - 1] - 'a']--;
          sm1.insert(cs);
        }
      }

      cs = vector<int>(26);
      for (int i : range(len - 1))
        cs[s2[i] - 'a']++;
      for (int l : range(s2.size())) {
        int r = l + len;
        if (r < s2.size() + 1) {
          cs[s2[r - 1] - 'a']++;
          if (l >= 1)
            cs[s2[l - 1] - 'a']--;
          if (sm1.count(cs))
            Mv = max(Mv, len);
        }
      }
    }
    cout << Mv << endl;
  }
};

int main() {
  cout << fixed << setprecision(20);
  cin.tie(0);
  ios::sync_with_stdio(false);
  Main().run();
  return 0;
}

Error: MLE

Fixed submission:

#include <algorithm> // other
#include <bitset>
#include <cassert> // c
#include <complex>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream> // io
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <regex>
#include <set>
#include <sstream>
#include <stack>
#include <vector> // container
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;

#define ALL(c) c.begin(), c.end()
#define IN(l, v, r) (l <= v && v < r)
template <class T> void UNIQUE(T &v) { v.erase(unique(ALL(v)), v.end()); }
// debug
#define DUMP(x) cerr << #x << " = " << (x)
#define LINE() cerr << " (L" << __LINE__ << ")"

struct range {
  struct Iter {
    int v, step;
    Iter &operator++() {
      v += step;
      return *this;
    }
    bool operator!=(Iter &itr) { return v < itr.v; }
    int &operator*() { return v; }
  };
  Iter i, n;
  range(int i, int n, int step) : i({i, step}), n({n, step}) {}
  range(int i, int n) : range(i, n, 1) {}
  range(int n) : range(0, n) {}
  Iter &begin() { return i; }
  Iter &end() { return n; }
};
struct rrange {
  struct Iter {
    int v, step;
    Iter &operator++() {
      v -= step;
      return *this;
    }
    bool operator!=(Iter &itr) { return v > itr.v; }
    int &operator*() { return v; }
  };
  Iter i, n;
  rrange(int i, int n, int step) : i({i - 1, step}), n({n - 1, step}) {}
  rrange(int i, int n) : rrange(i, n, 1) {}
  rrange(int n) : rrange(0, n) {}
  Iter &begin() { return n; }
  Iter &end() { return i; }
};

// input
template <typename T1, typename T2>
istream &operator>>(istream &is, pair<T1, T2> &p) {
  return is >> p.first >> p.second;
}
template <typename T1> istream &operator>>(istream &is, tuple<T1> &t) {
  return is >> get<0>(t);
}
template <typename T1, typename T2>
istream &operator>>(istream &is, tuple<T1, T2> &t) {
  return is >> get<0>(t) >> get<1>(t);
}
template <typename T1, typename T2, typename T3>
istream &operator>>(istream &is, tuple<T1, T2, T3> &t) {
  return is >> get<0>(t) >> get<1>(t) >> get<2>(t);
}
template <typename T1, typename T2, typename T3, typename T4>
istream &operator>>(istream &is, tuple<T1, T2, T3, T4> &t) {
  return is >> get<0>(t) >> get<1>(t) >> get<2>(t) >> get<3>(t);
}
template <typename T> istream &operator>>(istream &is, vector<T> &as) {
  for (int i : range(as.size()))
    is >> as[i];
  return is;
}
// output
template <typename T> ostream &operator<<(ostream &os, const set<T> &ss) {
  for (auto a : ss) {
    if (a != ss.begin())
      os << " ";
    os << a;
  }
  return os;
}
template <typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &p) {
  return os << p.first << " " << p.second;
}
template <typename K, typename V>
ostream &operator<<(ostream &os, const map<K, V> &m) {
  bool isF = true;
  for (auto &p : m) {
    if (!isF)
      os << endl;
    os << p;
    isF = false;
  }
  return os;
}
template <typename T1> ostream &operator<<(ostream &os, const tuple<T1> &t) {
  return os << get<0>(t);
}
template <typename T1, typename T2>
ostream &operator<<(ostream &os, const tuple<T1, T2> &t) {
  return os << get<0>(t) << " " << get<1>(t);
}
template <typename T1, typename T2, typename T3>
ostream &operator<<(ostream &os, const tuple<T1, T2, T3> &t) {
  return os << get<0>(t) << " " << get<1>(t) << " " << get<2>(t);
}
template <typename T1, typename T2, typename T3, typename T4>
ostream &operator<<(ostream &os, const tuple<T1, T2, T3, T4> &t) {
  return os << get<0>(t) << " " << get<1>(t) << " " << get<2>(t) << " "
            << get<3>(t);
}
template <typename T> ostream &operator<<(ostream &os, const vector<T> &as) {
  for (int i : range(as.size())) {
    if (i != 0)
      os << " ";
    os << as[i];
  }
  return os;
}
template <typename T>
ostream &operator<<(ostream &os, const vector<vector<T>> &as) {
  for (int i : range(as.size())) {
    if (i != 0)
      os << endl;
    os << as[i];
  }
  return os;
}

// values
template <typename T> inline T INF() { assert(false); };
template <> inline int INF<int>() { return 1 << 28; };
template <> inline ll INF<ll>() { return 1LL << 58; };
template <> inline double INF<double>() { return 1e16; };
template <> inline long double INF<long double>() { return 1e16; };

template <class T> inline T EPS() { assert(false); };
template <> inline int EPS<int>() { return 1; };
template <> inline ll EPS<ll>() { return 1LL; };
template <> inline double EPS<double>() { return 1e-8; };
template <> inline long double EPS<long double>() { return 1e-10; };

// min{2^r | n < 2^r}
template <typename T> T upper_pow2(T n) {
  T res = 1;
  while (res < n)
    res <<= 1;
  return res;
}
// max{d | 2^d  <= n}
template <typename T> T msb(T n) {
  int d = 62;
  while ((1LL << d) > n)
    d--;
  return d;
}

template <typename T, typename U> T pmod(T v, U M) { return (v % M + M) % M; }

class Main {
public:
  void run() {
    string s1, s2;
    cin >> s1 >> s2;

    map<vector<int>, int> sm1;

    for (int l : range(s1.size())) {
      vector<int> cs(26);
      for (int r : range(l + 1, s1.size() + 1)) {
        cs[s1[r - 1] - 'a']++;
        sm1[cs]++;
      }
    }

    int Mv = 0;
    for (int l : range(s2.size())) {
      vector<int> cs(26);
      for (int r : range(l + 1, s2.size() + 1)) {
        cs[s2[r - 1] - 'a']++;
        if (sm1.count(cs))
          Mv = max(Mv, r - l);
      }
    }
    cout << Mv << endl;
  }
};

int main() {
  cout << fixed << setprecision(20);
  cin.tie(0);
  ios::sync_with_stdio(false);
  Main().run();
  return 0;
}