Problem p00918 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h>
using namespace std;

#define dump(...) cout << "# " << #__VA_ARGS__ << '=' << (__VA_ARGS__) << endl
#define repi(i, a, b) for (int i = int(a); i < int(b); i++)
#define peri(i, a, b) for (int i = int(b); i-- > int(a);)
#define rep(i, n) repi(i, 0, n)
#define per(i, n) peri(i, 0, n)
#define all(c) begin(c), end(c)
#define mp make_pair
#define mt make_tuple

typedef unsigned int uint;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef vector<double> vd;
typedef vector<vd> vvd;
typedef vector<string> vs;

constexpr int INF = 1e9;
constexpr int MOD = 1e9 + 7;
constexpr double EPS = 1e-9;

template <typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &p) {
  return os << '(' << p.first << ',' << p.second << ')';
}
template <typename Ostream, typename Container>
Ostream &operator<<(Ostream &os, const Container &c) {
  os << '[';
  for (auto i = begin(c); i != end(c); ++i)
    os << (i == begin(c) ? "" : " ") << *i;
  return os << ']';
}

int main() {
  for (int hcost, vcost; cin >> hcost >> vcost && hcost | vcost;) {
    string src, dst;
    rep(i, 2) rep(j, 9) {
      int x;
      cin >> x;
      (i == 0 ? src : dst) += x + '0';
    }

    priority_queue<pair<int, string>, vector<pair<int, string>>,
                   greater<pair<int, string>>>
        pq;
    pq.emplace(0, src);
    unordered_map<string, int> vis;
    while (pq.size()) {
      int cc;
      string cur;
      tie(cc, cur) = pq.top();
      pq.pop();
      if (!vis.insert(mp(cur, cc)).second)
        continue;
      if (cur == dst)
        break;
      int i = cur.find('0');
      rep(k, 4) {
        int j = (i + array<int, 4>{-1, 1, -3, 3}[k] + 9) % 9;
        swap(cur[i], cur[j]);
        if (!vis.count(cur))
          pq.emplace(cc + (k < 2 ? hcost : vcost), cur);
        swap(cur[i], cur[j]);
      }
    }
    assert(vis.count(dst));
    cout << vis[dst] << endl;
  }
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;

#define dump(...) cout << "# " << #__VA_ARGS__ << '=' << (__VA_ARGS__) << endl
#define repi(i, a, b) for (int i = int(a); i < int(b); i++)
#define peri(i, a, b) for (int i = int(b); i-- > int(a);)
#define rep(i, n) repi(i, 0, n)
#define per(i, n) peri(i, 0, n)
#define all(c) begin(c), end(c)
#define mp make_pair
#define mt make_tuple

typedef unsigned int uint;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef vector<double> vd;
typedef vector<vd> vvd;
typedef vector<string> vs;

constexpr int INF = 1e9;
constexpr int MOD = 1e9 + 7;
constexpr double EPS = 1e-9;

template <typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &p) {
  return os << '(' << p.first << ',' << p.second << ')';
}
template <typename Ostream, typename Container>
Ostream &operator<<(Ostream &os, const Container &c) {
  os << '[';
  for (auto i = begin(c); i != end(c); ++i)
    os << (i == begin(c) ? "" : " ") << *i;
  return os << ']';
}

int main() {
  for (int hcost, vcost; cin >> hcost >> vcost && hcost | vcost;) {
    string src, dst;
    rep(i, 2) rep(j, 9) {
      int x;
      cin >> x;
      (i == 0 ? src : dst) += x + '0';
    }

    priority_queue<pair<int, string>, vector<pair<int, string>>,
                   greater<pair<int, string>>>
        pq;
    pq.emplace(0, src);
    map<string, int> vis;
    while (pq.size()) {
      int cc;
      string cur;
      tie(cc, cur) = pq.top();
      pq.pop();
      if (!vis.insert(mp(cur, cc)).second)
        continue;
      if (cur == dst)
        break;
      int i = cur.find('0');
      rep(k, 4) {
        int j = (i + array<int, 4>{-1, 1, -3, 3}[k] + 9) % 9;
        swap(cur[i], cur[j]);
        pq.emplace(cc + (k < 2 ? hcost : vcost), cur);
        swap(cur[i], cur[j]);
      }
    }
    assert(vis.count(dst));
    cout << vis[dst] << endl;
  }
}