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

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < n; i++)
#define INF 100000000
#define EPS 1e-10
#define MOD 1000000007
using namespace std;

int n;
string str[12];
vector<char> v;
map<char, int> m;
int num[15];
int z[2];
bool used[15];
int ppow10[10];
int flu[10][2];
bool cant[15];

void Pow10() {
  int ret = 1;
  rep(i, 10) {
    ppow10[i] = ret;
    ret *= 10;
  }
}

int func(int x) {
  int ret = 0;
  if (x <= v.size() - 1) {
    rep(i, 10) {
      if (used[i])
        continue;
      if (cant[x] && i == 0)
        continue;
      num[x] = i;
      used[i] = true;
      rep(j, 2) z[j] += flu[x][j] * i;
      ret += func(x + 1);
      rep(j, 2) z[j] -= flu[x][j] * i;
      num[x] = -1;
      used[i] = false;
    }
  } else {
    if (z[0] == z[1])
      return 1;
    else
      return 0;
  }
  return ret;
}

void solve() {
  v.clear();
  m.clear();
  rep(i, 15) cant[i] = false;
  rep(i, 2) z[i] = 0;
  rep(i, 10) rep(j, 2) flu[i][j] = 0;
  rep(i, 15) {
    num[i] = -1;
    used[i] = false;
  }
  rep(i, 12) str[i].clear();
  rep(i, n) {
    cin >> str[i];
    rep(j, str[i].size()) {
      bool ok = true;
      rep(k, v.size()) if (v[k] == str[i][j]) {
        if (i != n - 1)
          flu[m[v[k]]][0] += ppow10[str[i].size() - 1 - j];
        else
          flu[m[v[k]]][1] += ppow10[str[i].size() - 1 - j];
        ok = false;
      }
      if (ok)
        v.push_back(str[i][j]);
      if (ok)
        m[str[i][j]] = v.size() - 1;
      if (ok) {
        if (i != n - 1)
          flu[m[str[i][j]]][0] += ppow10[str[i].size() - 1 - j];
        else
          flu[m[str[i][j]]][1] += ppow10[str[i].size() - 1 - j];
      }
      if (j == 0 && str[i].size() > 1)
        cant[m[str[i][j]]] = true;
    }
  }
  cout << func(0) << endl;
}

int main() {
  Pow10();
  while (true) {
    cin >> n;
    if (n == 0)
      break;
    solve();
  }
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < n; i++)
#define INF 100000000
#define EPS 1e-10
#define MOD 1000000007
using namespace std;

int n;
string str[12];
vector<char> v;
map<char, int> m;
int num[15];
int z[15];
bool used[15];
int ppow10[10];
int flu[10][12];

void Pow10() {
  int ret = 1;
  rep(i, 10) {
    ppow10[i] = ret;
    ret *= 10;
  }
}

int func(int x) {
  int ret = 0;
  if (x <= v.size() - 1) {
    rep(i, 10) {
      if (used[i])
        continue;
      num[x] = i;
      used[i] = true;
      rep(j, n) z[j] += flu[x][j] * i;
      ret += func(x + 1);
      rep(j, n) z[j] -= flu[x][j] * i;
      num[x] = -1;
      used[i] = false;
    }
  } else {
    bool ok = true;
    rep(i, n) if (z[i] < ppow10[str[i].size() - 1] && str[i].size() > 1) {
      ok = false;
      break;
    }
    if (!ok)
      return 0;
    int sum = 0;
    rep(i, n - 1) sum += z[i];
    if (sum == z[n - 1])
      return 1;
    else
      return 0;
  }
  return ret;
}

void solve() {
  v.clear();
  m.clear();
  rep(i, 15) z[i] = 0;
  rep(i, 10) rep(j, 12) flu[i][j] = 0;
  rep(i, 15) {
    num[i] = -1;
    used[i] = false;
  }
  rep(i, 12) str[i].clear();
  rep(i, n) {
    cin >> str[i];
    rep(j, str[i].size()) {
      bool ok = true;
      rep(k, v.size()) if (v[k] == str[i][j]) {
        flu[m[v[k]]][i] += ppow10[str[i].size() - 1 - j];
        ok = false;
      }
      if (ok)
        v.push_back(str[i][j]);
      if (ok)
        m[str[i][j]] = v.size() - 1;
      if (ok)
        flu[m[str[i][j]]][i] += ppow10[str[i].size() - 1 - j];
    }
  }
  cout << func(0) << endl;
}

int main() {
  Pow10();
  while (true) {
    cin >> n;
    if (n == 0)
      break;
    solve();
  }
}