#include<cstdio>
#include<algorithm>
#include<queue>
#include<map>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<set>
#include<unordered_map>
#include<vector>
typedef long long ll;
using namespace std;
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define N 100010
#define P 26
ll val[P];
char s[N];
// SAM
struct SAM{
int tr[N<<1][P],len[N<<1],fa[N<<1];
int last,tot;
void init(){
tot=0;
last=tot=newnode();
}
int newnode(){
++tot;
memset(tr[tot],0,sizeof(tr[tot]));
fa[tot]=len[tot]=0;
return tot;
}
void insert(int c){
int p=last,np=newnode();
last=np;
len[np]=len[p]+1;
while(p&&!tr[p][c])tr[p][c]=np,p=fa[p];
if(!p)fa[np]=1;
else{
int q=tr[p][c];
if(len[q]==len[p]+1)fa[np]=q;
else{
int nq=newnode();
len[nq]=len[p]+1;
memcpy(tr[nq],tr[q],sizeof(tr[q]));
fa[nq]=fa[q];
fa[q]=fa[np]=nq;
while(tr[p][c]==q)tr[p][c]=nq,p=fa[p];
}
}
}
}sam;
// monotone queue
ll f[N];
int hd,tl;
pll Q[N];
void insert(int p,ll v){
while(hd<tl&&Q[tl-1].se>v)tl--;
Q[tl++]=mp(p,v);
}
ll get(int p){
while(hd<tl&&Q[hd].fi<p)hd++;
if(hd>=tl)return 1e18;
else return Q[hd].se;
}
int main(){
int T,i,j,cas=0;
ll A,B;
scanf("%d",&T);
while(T--){
hd=tl=0;
scanf("%s",s+1);
int n=strlen(s+1);
for(i=0;i<26;i++)scanf("%lld",&val[i]);
scanf("%lld%lld",&A,&B);
sam.init();
j=0;
int cur=1; // [j+1...i-1]
for(i=1;i<=n;i++){
//int F=sam.fa[cur];
while(j+1<=i-1&&!sam.tr[cur][s[i]-'a']){
// correct
if(sam.len[sam.fa[cur]]>=i-1-(j+1))cur=sam.fa[cur];
sam.insert(s[++j]-'a');
while(sam.fa[cur]&&sam.len[sam.fa[cur]]>=i-1-j)cur=sam.fa[cur];
// correct 2
/*if(sam.len[F]>=i-1-(j+1))cur=F,F=sam.fa[cur];
sam.insert(s[++j]-'a');*/
// wrong
/*if(sam.len[sam.fa[cur]]>=i-1-(j+1))cur=sam.fa[cur];
sam.insert(s[++j]-'a');*/
}
if(sam.tr[cur][s[i]-'a']){
cur=sam.tr[cur][s[i]-'a'];
}else{
cur=1;
hd=tl=0;
sam.insert(s[++j]-'a');
}
f[i]=min(f[i-1]+val[s[i]-'a'],get(j)+1LL*i*A);
insert(i,f[i]-1LL*i*A+2*B);
}
printf("Case #%d: %lld\n",++cas,f[n]);
}
return 0;
}