#include #include #include #include using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); string A; cin >> A; int sizeA = A.length(); // 文字からインデックスへのマッピング map char_to_idx; for (int i = 0; i < sizeA; ++i) { char_to_idx[A[i]] = i; } // 距離行列の読み込み vector> d(sizeA, vector(sizeA)); for (int i = 0; i < sizeA; ++i) { for (int j = 0; j < sizeA; ++j) { cin >> d[i][j]; } } int N, M; cin >> N >> M; vector S(N); for (int i = 0; i < N; ++i) { cin >> S[i]; } // 各位置 k において、各文字 c が何回出現するかをカウント // count[k][c_idx] vector> counts(M, vector(sizeA, 0)); for (int i = 0; i < N; ++i) { for (int k = 0; k < M; ++k) { counts[k][char_to_idx[S[i][k]]]++; } } // 各位置 k において、ある文字 alpha を選んだ時の距離の総和を前計算 // precalc_cost[k][alpha_idx] vector> precalc_cost(M, vector(sizeA, 0)); for (int k = 0; k < M; ++k) { for (int a_idx = 0; a_idx < sizeA; ++a_idx) { long long sum_dist = 0; for (int c_idx = 0; c_idx < sizeA; ++c_idx) { sum_dist += d[a_idx][c_idx] * counts[k][c_idx]; } precalc_cost[k][a_idx] = sum_dist; } } // 各文字列 Si について、全位置のコストを合計して出力 for (int i = 0; i < N; ++i) { long long total_Hi = 0; for (int k = 0; k < M; ++k) { total_Hi += precalc_cost[k][char_to_idx[S[i][k]]]; } cout << total_Hi << "\n"; } return 0; }