#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
template < class S, class T> inline S chmax( S & a, T b) {
if ( a< b) {
a= b;
}
return a;
}
#define main dummy_main
int main( ) {
return 0 ;
}
#undef main
class Solution{
public :
int maxScoreWords( vector< string> & S, vector< char > & letters, vector< int > & score) {
int i, mask;
int N = S.size ( ) ;
int rm[ 26 ] ;
int cnt[ 26 ] = { } ;
int res = 0 ;
int tmp;
N = S.size ( ) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
int j;
for ( j= ( 0 ) ; j< ( S[ i] .size ( ) ) ; j++ ) {
S[ i] [ j] - = 'a' ;
}
}
for ( i= ( 0 ) ; i< ( letters.size ( ) ) ; i++ ) {
cnt[ letters[ i] - 'a' ] ++ ;
}
for ( mask= ( 0 ) ; mask< ( 1 << N) ; mask++ ) {
tmp = 0 ;
for ( i= ( 0 ) ; i< ( 26 ) ; i++ ) {
rm[ i] = cnt[ i] ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
if ( ( ( mask) & ( 1 << ( i) ) ) ) {
int tU__gIr_;
for ( tU__gIr_= ( 0 ) ; tU__gIr_< ( S[ i] .size ( ) ) ; tU__gIr_++ ) {
auto & j = S[ i] [ tU__gIr_] ;
if ( ( rm[ j] -- ) == 0 ) {
tmp = 0 ;
goto ao_dF3pO;
}
tmp + = score[ j] ;
}
}
}
ao_dF3pO:;
chmax( res, tmp) ;
}
return res;
}
}
;
// cLay varsion 20191108-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// class Solution {
// public:
// int maxScoreWords(vector<string>& S, vector<char>& letters, vector<int>& score) {
// int N = S.size();
// int rm[26], cnt[26] = {};
// int res = 0, tmp;
//
// N = S.size();
// rep(i,N) rep(j,S[i].size()) S[i][j] -= 'a';
// rep(i,letters.size()) cnt[letters[i]-'a']++;
//
// rep(mask,1<<N){
// tmp = 0;
// rep(i,26) rm[i] = cnt[i];
// rep(i,N) if(BIT_ith(mask,i)) rep[S[i]](j,S[i].size()){
// if((rm[j]--)==0) tmp = 0, break_break;
// tmp += score[j];
// }
// res >?= tmp;
// }
//
// return res;
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPZmFzdCIpCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnRlbXBsYXRlPGNsYXNzIFMsIGNsYXNzIFQ+IGlubGluZSBTIGNobWF4KFMgJmEsIFQgYil7CiAgaWYoYTxiKXsKICAgIGE9YjsKICB9CiAgcmV0dXJuIGE7Cn0KI2RlZmluZSBtYWluIGR1bW15X21haW4KaW50IG1haW4oKXsKICByZXR1cm4gMDsKfQojdW5kZWYgbWFpbgpjbGFzcyBTb2x1dGlvbnsKICBwdWJsaWM6CiAgaW50IG1heFNjb3JlV29yZHModmVjdG9yPHN0cmluZz4mIFMsIHZlY3RvcjxjaGFyPiYgbGV0dGVycywgdmVjdG9yPGludD4mIHNjb3JlKXsKICAgIGludCBpLCBtYXNrOwogICAgaW50IE4gPSBTLnNpemUoKTsKICAgIGludCBybVsyNl07CiAgICBpbnQgY250WzI2XSA9IHt9OwogICAgaW50IHJlcyA9IDA7CiAgICBpbnQgdG1wOwogICAgTiA9IFMuc2l6ZSgpOwogICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgIGludCBqOwogICAgICBmb3Ioaj0oMCk7ajwoU1tpXS5zaXplKCkpO2orKyl7CiAgICAgICAgU1tpXVtqXSAtPSAnYSc7CiAgICAgIH0KICAgIH0KICAgIGZvcihpPSgwKTtpPChsZXR0ZXJzLnNpemUoKSk7aSsrKXsKICAgICAgY250W2xldHRlcnNbaV0tJ2EnXSsrOwogICAgfQogICAgZm9yKG1hc2s9KDApO21hc2s8KDE8PE4pO21hc2srKyl7CiAgICAgIHRtcCA9IDA7CiAgICAgIGZvcihpPSgwKTtpPCgyNik7aSsrKXsKICAgICAgICBybVtpXSA9IGNudFtpXTsKICAgICAgfQogICAgICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgICAgICBpZigoKG1hc2spICYoMTw8KGkpKSkpewogICAgICAgICAgaW50IHRVX19nSXJfOwogICAgICAgICAgZm9yKHRVX19nSXJfPSgwKTt0VV9fZ0lyXzwoU1tpXS5zaXplKCkpO3RVX19nSXJfKyspewogICAgICAgICAgICBhdXRvICZqID0gU1tpXVt0VV9fZ0lyX107CiAgICAgICAgICAgIGlmKChybVtqXS0tKT09MCl7CiAgICAgICAgICAgICAgdG1wID0gMDsKICAgICAgICAgICAgICBnb3RvIGFvX2RGM3BPOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRtcCArPSBzY29yZVtqXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgYW9fZEYzcE86OwogICAgICBjaG1heChyZXMsIHRtcCk7CiAgICB9CiAgICByZXR1cm4gcmVzOwogIH0KfQo7Ci8vIGNMYXkgdmFyc2lvbiAyMDE5MTEwOC0xCgovLyAtLS0gb3JpZ2luYWwgY29kZSAtLS0KLy8gI2RlZmluZSBtYWluIGR1bW15X21haW4KLy8ge30KLy8gI3VuZGVmIG1haW4KLy8gCi8vIGNsYXNzIFNvbHV0aW9uIHsKLy8gcHVibGljOgovLyAgIGludCBtYXhTY29yZVdvcmRzKHZlY3RvcjxzdHJpbmc+JiBTLCB2ZWN0b3I8Y2hhcj4mIGxldHRlcnMsIHZlY3RvcjxpbnQ+JiBzY29yZSkgewovLyAgICAgaW50IE4gPSBTLnNpemUoKTsKLy8gICAgIGludCBybVsyNl0sIGNudFsyNl0gPSB7fTsKLy8gICAgIGludCByZXMgPSAwLCB0bXA7Ci8vIAovLyAgICAgTiA9IFMuc2l6ZSgpOwovLyAgICAgcmVwKGksTikgcmVwKGosU1tpXS5zaXplKCkpIFNbaV1bal0gLT0gJ2EnOwovLyAgICAgcmVwKGksbGV0dGVycy5zaXplKCkpIGNudFtsZXR0ZXJzW2ldLSdhJ10rKzsKLy8gCi8vICAgICByZXAobWFzaywxPDxOKXsKLy8gICAgICAgdG1wID0gMDsKLy8gICAgICAgcmVwKGksMjYpIHJtW2ldID0gY250W2ldOwovLyAgICAgICByZXAoaSxOKSBpZihCSVRfaXRoKG1hc2ssaSkpIHJlcFtTW2ldXShqLFNbaV0uc2l6ZSgpKXsKLy8gICAgICAgICBpZigocm1bal0tLSk9PTApIHRtcCA9IDAsIGJyZWFrX2JyZWFrOwovLyAgICAgICAgIHRtcCArPSBzY29yZVtqXTsKLy8gICAgICAgfQovLyAgICAgICByZXMgPj89IHRtcDsKLy8gICAgIH0KLy8gCi8vICAgICByZXR1cm4gcmVzOwovLyAgIH0KLy8gfTsK