#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
template < class T, class S> inline T pow_L( T a, S b) {
T res = 1 ;
res = 1 ;
for ( ;; ) {
if ( b& 1 ) {
res * = a;
}
b >>= 1 ;
if ( b== 0 ) {
break ;
}
a * = a;
}
return res;
}
inline double pow_L( double a, double b) {
return pow ( a,b) ;
}
#define main dummy_main
int main( ) {
return 0 ;
}
#undef main
vector< string> w;
int len[ 6 ] ;
int d;
int ind[ 10 ] ;
int use[ 10 ] ;
int lead[ 10 ] ;
bool solve( int ok) {
int i;
int j;
int k;
int t;
int md;
if ( ok== 8 ) {
return true ;
}
for ( i= ( 0 ) ; i< ( w.size ( ) ) ; i++ ) {
if ( len[ i] > ok && ind[ w[ i] [ len[ i] - 1 - ok] ] == - 1 ) {
j = w[ i] [ len[ i] - 1 - ok] ;
for ( k= ( 0 ) ; k< ( 10 ) ; k++ ) {
if ( use[ k] == 0 ) {
if ( lead[ j] && k== 0 ) {
continue ;
}
ind[ j] = k;
use[ k] = 1 ;
if ( solve( ok) ) {
return true ;
}
ind[ j] = - 1 ;
use[ k] = 0 ;
}
}
return false ;
}
}
ok++ ;
k = 0 ;
md = pow_L( 10 ,ok) ;
for ( i= ( 0 ) ; i< ( w.size ( ) ) ; i++ ) {
t = 0 ;
for ( j= ( 0 ) ; j< ( len[ i] ) ; j++ ) {
t = 10 * t + ind[ w[ i] [ j] ] ;
}
if ( i== w.size ( ) - 1 ) {
k - = t;
}
else {
k + = t;
}
}
if ( k% md) {
return false ;
}
return solve( ok) ;
}
class Solution{
public :
bool isSolvable( vector< string> & words, string result) {
int i;
int vis[ 26 ] = { } ;
w = words;
w.push_back ( result) ;
for ( i= ( 0 ) ; i< ( w.size ( ) ) ; i++ ) {
len[ i] = w[ i] .size ( ) ;
}
for ( i= ( 0 ) ; i< ( w.size ( ) ) ; i++ ) {
int j;
for ( j= ( 0 ) ; j< ( w[ i] .size ( ) ) ; j++ ) {
vis[ w[ i] [ j] - 'A' ] = 1 ;
}
}
d = 0 ;
for ( i= ( 0 ) ; i< ( 26 ) ; i++ ) {
if ( vis[ i] == 0 ) {
vis[ i] = - 1 ;
continue ;
}
vis[ i] = d++ ;
}
for ( i= ( 0 ) ; i< ( w.size ( ) ) ; i++ ) {
int j;
for ( j= ( 0 ) ; j< ( w[ i] .size ( ) ) ; j++ ) {
w[ i] [ j] = vis[ w[ i] [ j] - 'A' ] ;
}
}
for ( i= ( 0 ) ; i< ( d) ; i++ ) {
ind[ i] = - 1 ;
}
for ( i= ( 0 ) ; i< ( 10 ) ; i++ ) {
use[ i] = lead[ i] = 0 ;
}
for ( i= ( 0 ) ; i< ( w.size ( ) ) ; i++ ) {
lead[ w[ i] [ 0 ] ] = 1 ;
}
return solve( 0 ) ;
}
}
;
// cLay varsion 20200214-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// vector<string> w; int len[6];
// int d, ind[10], use[10], lead[10];
//
// bool solve(int ok){
// int i, j, k, t, md;
//
// if(ok==8) return true;
//
// rep(i,w.size()) if(len[i] > ok && ind[w[i][len[i]-1-ok]]==-1){
// j = w[i][len[i]-1-ok];
// rep(k,10) if(use[k]==0){
// if(lead[j] && k==0) continue;
// ind[j] = k;
// use[k] = 1;
// if(solve(ok)) return true;
// ind[j] = -1;
// use[k] = 0;
// }
// return false;
// }
//
// ok++;
// k = 0;
// md = 10 ** ok;
// rep(i,w.size()){
// t = 0;
// rep(j,len[i]) t = 10 t + ind[w[i][j]];
// if[i==w.size()-1, k -= t, k += t];
// }
// if(k%md) return false;
//
// return solve(ok);
// }
//
// class Solution {
// public:
// bool isSolvable(vector<string>& words, string result) {
// int vis[26] = {};
// w = words;
// w.push_back(result);
// rep(i,w.size()) len[i] = w[i].size();
// rep(i,w.size()) rep(j,w[i].size()) vis[w[i][j]-'A'] = 1;
//
// d = 0;
// rep(i,26){
// if(vis[i]==0) vis[i] = -1, continue;
// vis[i] = d++;
// }
// rep(i,w.size()) rep(j,w[i].size()) w[i][j] = vis[w[i][j]-'A'];
//
// rep(i,d) ind[i] = -1;
// rep(i,10) use[i] = lead[i] = 0;
// rep(i,w.size()) lead[w[i][0]] = 1;
//
// return solve(0);
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPZmFzdCIpCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFM+IGlubGluZSBUIHBvd19MKFQgYSwgUyBiKXsKICBUIHJlcyA9IDE7CiAgcmVzID0gMTsKICBmb3IoOzspewogICAgaWYoYiYxKXsKICAgICAgcmVzICo9IGE7CiAgICB9CiAgICBiID4+PSAxOwogICAgaWYoYj09MCl7CiAgICAgIGJyZWFrOwogICAgfQogICAgYSAqPSBhOwogIH0KICByZXR1cm4gcmVzOwp9CmlubGluZSBkb3VibGUgcG93X0woZG91YmxlIGEsIGRvdWJsZSBiKXsKICByZXR1cm4gcG93KGEsYik7Cn0KI2RlZmluZSBtYWluIGR1bW15X21haW4KaW50IG1haW4oKXsKICByZXR1cm4gMDsKfQojdW5kZWYgbWFpbgp2ZWN0b3I8c3RyaW5nPiB3OwppbnQgbGVuWzZdOwppbnQgZDsKaW50IGluZFsxMF07CmludCB1c2VbMTBdOwppbnQgbGVhZFsxMF07CmJvb2wgc29sdmUoaW50IG9rKXsKICBpbnQgaTsKICBpbnQgajsKICBpbnQgazsKICBpbnQgdDsKICBpbnQgbWQ7CiAgaWYob2s9PTgpewogICAgcmV0dXJuIHRydWU7CiAgfQogIGZvcihpPSgwKTtpPCh3LnNpemUoKSk7aSsrKXsKICAgIGlmKGxlbltpXSA+IG9rICYmIGluZFt3W2ldW2xlbltpXS0xLW9rXV09PS0xKXsKICAgICAgaiA9IHdbaV1bbGVuW2ldLTEtb2tdOwogICAgICBmb3Ioaz0oMCk7azwoMTApO2srKyl7CiAgICAgICAgaWYodXNlW2tdPT0wKXsKICAgICAgICAgIGlmKGxlYWRbal0gJiYgaz09MCl7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaW5kW2pdID0gazsKICAgICAgICAgIHVzZVtrXSA9IDE7CiAgICAgICAgICBpZihzb2x2ZShvaykpewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGluZFtqXSA9IC0xOwogICAgICAgICAgdXNlW2tdID0gMDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICBvaysrOwogIGsgPSAwOwogIG1kID1wb3dfTCgxMCxvayk7CiAgZm9yKGk9KDApO2k8KHcuc2l6ZSgpKTtpKyspewogICAgdCA9IDA7CiAgICBmb3Ioaj0oMCk7ajwobGVuW2ldKTtqKyspewogICAgICB0ID0gMTAqIHQgKyBpbmRbd1tpXVtqXV07CiAgICB9CiAgICBpZihpPT13LnNpemUoKS0xKXsKICAgICAgayAtPSB0OwogICAgfQogICAgZWxzZXsKICAgICAgayArPSB0OwogICAgfQogIH0KICBpZihrJW1kKXsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgcmV0dXJuIHNvbHZlKG9rKTsKfQpjbGFzcyBTb2x1dGlvbnsKICBwdWJsaWM6CiAgYm9vbCBpc1NvbHZhYmxlKHZlY3RvcjxzdHJpbmc+JiB3b3Jkcywgc3RyaW5nIHJlc3VsdCl7CiAgICBpbnQgaTsKICAgIGludCB2aXNbMjZdID0ge307CiAgICB3ID0gd29yZHM7CiAgICB3LnB1c2hfYmFjayhyZXN1bHQpOwogICAgZm9yKGk9KDApO2k8KHcuc2l6ZSgpKTtpKyspewogICAgICBsZW5baV0gPSB3W2ldLnNpemUoKTsKICAgIH0KICAgIGZvcihpPSgwKTtpPCh3LnNpemUoKSk7aSsrKXsKICAgICAgaW50IGo7CiAgICAgIGZvcihqPSgwKTtqPCh3W2ldLnNpemUoKSk7aisrKXsKICAgICAgICB2aXNbd1tpXVtqXS0nQSddID0gMTsKICAgICAgfQogICAgfQogICAgZCA9IDA7CiAgICBmb3IoaT0oMCk7aTwoMjYpO2krKyl7CiAgICAgIGlmKHZpc1tpXT09MCl7CiAgICAgICAgdmlzW2ldID0gLTE7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgdmlzW2ldID0gZCsrOwogICAgfQogICAgZm9yKGk9KDApO2k8KHcuc2l6ZSgpKTtpKyspewogICAgICBpbnQgajsKICAgICAgZm9yKGo9KDApO2o8KHdbaV0uc2l6ZSgpKTtqKyspewogICAgICAgIHdbaV1bal0gPSB2aXNbd1tpXVtqXS0nQSddOwogICAgICB9CiAgICB9CiAgICBmb3IoaT0oMCk7aTwoZCk7aSsrKXsKICAgICAgaW5kW2ldID0gLTE7CiAgICB9CiAgICBmb3IoaT0oMCk7aTwoMTApO2krKyl7CiAgICAgIHVzZVtpXSA9IGxlYWRbaV0gPSAwOwogICAgfQogICAgZm9yKGk9KDApO2k8KHcuc2l6ZSgpKTtpKyspewogICAgICBsZWFkW3dbaV1bMF1dID0gMTsKICAgIH0KICAgIHJldHVybiBzb2x2ZSgwKTsKICB9Cn0KOwovLyBjTGF5IHZhcnNpb24gMjAyMDAyMTQtMQoKLy8gLS0tIG9yaWdpbmFsIGNvZGUgLS0tCi8vICNkZWZpbmUgbWFpbiBkdW1teV9tYWluCi8vIHt9Ci8vICN1bmRlZiBtYWluCi8vIAovLyB2ZWN0b3I8c3RyaW5nPiB3OyBpbnQgbGVuWzZdOwovLyBpbnQgZCwgaW5kWzEwXSwgdXNlWzEwXSwgbGVhZFsxMF07Ci8vIAovLyBib29sIHNvbHZlKGludCBvayl7Ci8vICAgaW50IGksIGosIGssIHQsIG1kOwovLyAKLy8gICBpZihvaz09OCkgcmV0dXJuIHRydWU7Ci8vIAovLyAgIHJlcChpLHcuc2l6ZSgpKSBpZihsZW5baV0gPiBvayAmJiBpbmRbd1tpXVtsZW5baV0tMS1va11dPT0tMSl7Ci8vICAgICBqID0gd1tpXVtsZW5baV0tMS1va107Ci8vICAgICByZXAoaywxMCkgaWYodXNlW2tdPT0wKXsKLy8gICAgICAgaWYobGVhZFtqXSAmJiBrPT0wKSBjb250aW51ZTsKLy8gICAgICAgaW5kW2pdID0gazsKLy8gICAgICAgdXNlW2tdID0gMTsKLy8gICAgICAgaWYoc29sdmUob2spKSByZXR1cm4gdHJ1ZTsKLy8gICAgICAgaW5kW2pdID0gLTE7Ci8vICAgICAgIHVzZVtrXSA9IDA7Ci8vICAgICB9Ci8vICAgICByZXR1cm4gZmFsc2U7Ci8vICAgfQovLyAKLy8gICBvaysrOwovLyAgIGsgPSAwOwovLyAgIG1kID0gMTAgKiogb2s7Ci8vICAgcmVwKGksdy5zaXplKCkpewovLyAgICAgdCA9IDA7Ci8vICAgICByZXAoaixsZW5baV0pIHQgPSAxMCB0ICsgaW5kW3dbaV1bal1dOwovLyAgICAgaWZbaT09dy5zaXplKCktMSwgayAtPSB0LCBrICs9IHRdOwovLyAgIH0KLy8gICBpZihrJW1kKSByZXR1cm4gZmFsc2U7Ci8vIAovLyAgIHJldHVybiBzb2x2ZShvayk7Ci8vIH0KLy8gCi8vIGNsYXNzIFNvbHV0aW9uIHsKLy8gcHVibGljOgovLyAgIGJvb2wgaXNTb2x2YWJsZSh2ZWN0b3I8c3RyaW5nPiYgd29yZHMsIHN0cmluZyByZXN1bHQpIHsKLy8gICAgIGludCB2aXNbMjZdID0ge307Ci8vICAgICB3ID0gd29yZHM7Ci8vICAgICB3LnB1c2hfYmFjayhyZXN1bHQpOwovLyAgICAgcmVwKGksdy5zaXplKCkpIGxlbltpXSA9IHdbaV0uc2l6ZSgpOwovLyAgICAgcmVwKGksdy5zaXplKCkpIHJlcChqLHdbaV0uc2l6ZSgpKSB2aXNbd1tpXVtqXS0nQSddID0gMTsKLy8gCi8vICAgICBkID0gMDsKLy8gICAgIHJlcChpLDI2KXsKLy8gICAgICAgaWYodmlzW2ldPT0wKSB2aXNbaV0gPSAtMSwgY29udGludWU7Ci8vICAgICAgIHZpc1tpXSA9IGQrKzsKLy8gICAgIH0KLy8gICAgIHJlcChpLHcuc2l6ZSgpKSByZXAoaix3W2ldLnNpemUoKSkgd1tpXVtqXSA9IHZpc1t3W2ldW2pdLSdBJ107Ci8vIAovLyAgICAgcmVwKGksZCkgaW5kW2ldID0gLTE7Ci8vICAgICByZXAoaSwxMCkgdXNlW2ldID0gbGVhZFtpXSA9IDA7Ci8vICAgICByZXAoaSx3LnNpemUoKSkgbGVhZFt3W2ldWzBdXSA9IDE7Ci8vIAovLyAgICAgcmV0dXJuIHNvbHZlKDApOwovLyAgIH0KLy8gfTsK