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

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

#define rep(i, x, y) for (int i = (x); i < (y); ++i)
#define debug(x) #x << "=" << (x)

#ifdef DEBUG
#define _GLIBCXX_DEBUG
#define dump(x) std::cerr << debug(x) << " (L:" << __LINE__ << ")" << std::endl
#else
#define dump(x)
#endif

typedef long long int ll;
typedef pair<int, int> pii;
// template<typename T> using vec=std::vector<T>;

const int inf = 1 << 30;
const long long int infll = 1LL << 58;
const double eps = 1e-9;
const int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1};

template <typename T> ostream &operator<<(ostream &os, const vector<T> &vec) {
  os << "[";
  for (const auto &v : vec) {
    os << v << ",";
  }
  os << "]";
  return os;
}

int decode(const string &str, unordered_map<char, int> &table) {
  int res = 0, b = 1;
  for (int i = str.size() - 1; i >= 0; --i) {
    res += table[str[i]] * b;
    b *= 10;
  }
  return res;
}

int permutation(int n) {
  int res = 1;
  for (int i = 1; i <= n; ++i)
    res *= i;
  return res;
}

void solve() {
  while (true) {
    int n;
    cin >> n;
    if (n == 0)
      break;

    vector<string> strs(n);
    int max_length = 0;
    for (int i = 0; i < n; ++i) {
      cin >> strs[i];
      if (i != n - 1)
        max_length = max(max_length, (int)strs[i].size());
    }
    if (max_length > strs.back().size()) {
      cout << 0 << endl;
      continue;
    }

    vector<int> weight(26);
    vector<bool> not0(26, false);
    const char A = 'A';
    for (int i = 0; i < strs.size(); ++i) {
      const string &str = strs[i];
      if (str.size() != 1)
        not0[str[0] - A] = true;
      int b = 1;
      for (int j = str.size() - 1; j >= 0; --j) {
        if (i == n - 1)
          weight[str[j] - A] -= b;
        else
          weight[str[j] - A] += b;
        b *= 10;
      }
    }

    vector<char> appear;
    for (string &str : strs)
      for (char ch : str)
        appear.push_back(ch);
    sort(appear.begin(), appear.end());
    appear.erase(unique(appear.begin(), appear.end()), appear.end());

    vector<int> num;
    rep(i, 0, 10) num.emplace_back(i);
    int ans = 0;
    do {
      string perm;
      int sum = 0;
      bool ok = true;
      rep(i, 0, appear.size()) {
        sum += weight[appear[i] - A] * num[i];
        if (num[i] == 0 and not0[appear[i] - A]) {
          ok = false;
          break;
        }
      }
      if (ok and sum == 0)
        ++ans;
    } while (next_permutation(num.begin(), num.end()));
    cout << ans / permutation(10 - appear.size()) << endl;
  }
}

int main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(0);
  solve();
  return 0;
}

Error: TLE

Fixed submission:

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

#define rep(i, x, y) for (int i = (x); i < (y); ++i)
#define debug(x) #x << "=" << (x)

#ifdef DEBUG
#define _GLIBCXX_DEBUG
#define dump(x) std::cerr << debug(x) << " (L:" << __LINE__ << ")" << std::endl
#else
#define dump(x)
#endif

typedef long long int ll;
typedef pair<int, int> pii;
// template<typename T> using vec=std::vector<T>;

const int inf = 1 << 30;
const long long int infll = 1LL << 58;
const double eps = 1e-9;
const int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1};

template <typename T> ostream &operator<<(ostream &os, const vector<T> &vec) {
  os << "[";
  for (const auto &v : vec) {
    os << v << ",";
  }
  os << "]";
  return os;
}

int decode(const string &str, unordered_map<char, int> &table) {
  int res = 0, b = 1;
  for (int i = str.size() - 1; i >= 0; --i) {
    res += table[str[i]] * b;
    b *= 10;
  }
  return res;
}

int permutation(int n) {
  int res = 1;
  for (int i = 1; i <= n; ++i)
    res *= i;
  return res;
}

void solve() {
  while (true) {
    int n;
    cin >> n;
    if (n == 0)
      break;

    vector<string> strs(n);
    int max_length = 0;
    for (int i = 0; i < n; ++i) {
      cin >> strs[i];
      if (i != n - 1)
        max_length = max(max_length, (int)strs[i].size());
    }
    if (max_length > strs.back().size()) {
      cout << 0 << endl;
      continue;
    }

    unordered_map<char, int> weight;
    unordered_set<char> not0;
    for (int i = 0; i < strs.size(); ++i) {
      const string &str = strs[i];
      if (str.size() != 1)
        not0.insert(str[0]);
      int b = 1;
      for (int j = str.size() - 1; j >= 0; --j) {
        if (i == n - 1)
          weight[str[j]] -= b;
        else
          weight[str[j]] += b;
        b *= 10;
      }
    }

    vector<char> appear;
    for (string &str : strs)
      for (char ch : str)
        appear.push_back(ch);
    sort(appear.begin(), appear.end());
    appear.erase(unique(appear.begin(), appear.end()), appear.end());

    vector<int> num;
    rep(i, 0, 10) num.emplace_back(i);
    int ans = 0;
    do {
      string perm;
      int sum = 0;
      bool ok = true;
      rep(i, 0, appear.size()) {
        sum += weight[appear[i]] * num[i];
        if (num[i] == 0 and not0.find(appear[i]) != not0.end()) {
          ok = false;
          break;
        }
      }
      if (ok and sum == 0)
        ++ans;
    } while (next_permutation(num.begin(), num.end()));
    cout << ans / permutation(10 - appear.size()) << endl;
  }
}

int main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(0);
  solve();
  return 0;
}