#include #include #define MAX 128 int F[MAX][MAX]; char cut[MAX][MAX]; char split[MAX]; char keys[MAX]; char letters[MAX]; int freqs[MAX]; int freq( int a, int b ) { int ret = 0; int pos = 1; while( a <= b ) { ret += freqs[a]*pos; pos++; a++; } return ret; } int main() { int ncases = 0; scanf( "%d", &ncases ); for( int keypad = 1; keypad <= ncases; keypad++ ) { int K = 0; int L = 0; scanf( "%d %d\n", &K, &L ); gets( keys ); gets( letters ); int n, k, l; for( l = 0; l < L; l++ ) scanf( "%d", &freqs[l] ); for( n = 0; n <= L-K; n++ ) { F[0][n] = freq(0,n); cut[0][n] = 0; } for( k = 1; k < K; k++ ) for( l = k; l <= L-K+k; l++ ) { int min = -1; for( n = k; n <= l; n++ ) { int amin = F[k-1][n-1] + freq(n,l); if( amin < min || n == k ) { min = amin; cut[k][l] = n; } } F[k][l] = min; } split[0] = 0; split[K] = L; l = l-1; for( k = K-1; k >= 1; k-- ) { split[k] = cut[k][l]; l = cut[k][l]-1; } printf( "Keypad #%d:\n", keypad ); for( k = 0; k < K; k++ ) { printf( "%c: ", keys[k] ); for( l = split[k]; l < split[k+1]; l++ ) printf( "%c", letters[l] ); printf( "\n" ); } printf( "\n" ); } return(0); }