#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int P = 55;
const int N = 100005;
const int inf = 1e9;
int dp[P][N][2], mx[2][N];
int n, k, m, g1, g2, g3, a[P];
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cout<<setprecision(32);
cin>>n>>k>>g1>>g2>>g3;
string str; cin>>str;
memset(a, 0, sizeof(a));
m = 1;
for(int i = 0; i < n; i++){
if(str[i] == '#')m++;
else a[m]++;
}
memset(dp, 0, sizeof(dp));
for(int j = 0; j <= k; j++){
dp[0][j][1] = -inf;
}
for(int i = 1; i <= m; i++){
if(a[i] == 0){
for(int j = 0; j <= k; j++){
dp[i][j][0] = dp[i - 1][j][0];
dp[i][j][1] = -inf;
}
continue;
}
for(int j = 0; j <= k; j++){
dp[i][j][0] = dp[i][j][1] = -inf;
mx[0][j] = dp[i - 1][j][0] - j*g1 + ((a[i] + j)/2)*g2;
mx[1][j] = dp[i - 1][j][0] - j*g1 + ((a[i] + j - 1)/2)*g2;
}
deque<int> dq[2];
for(int j = 0; j <= k; j++){
for(int par = 0; par < 2; par++){
if(!dq[par].empty() && dq[par].front() < j - a[i])dq[par].pop_front();
while(!dq[par].empty() && mx[par][dq[par].back()] <= mx[par][j])dq[par].pop_back();
dq[par].push_back(j);
}
dp[i][j][0] = max(dp[i][j][0], mx[j&1][dq[j&1].front()] + j*g1 - (j/2)*g2);
}
for(int par = 0; par < 2; par++){
dq[par].clear();
}
for(int j = 0; j <= k; j++){
mx[0][j] = dp[i - 1][j][1] + g3 - j*g1 + ((a[i] + j - 1)/2)*g2;
mx[1][j] = dp[i - 1][j][1] + g3 - j*g1 + ((a[i] + j)/2)*g2 - g2;
}
for(int j = 0; j <= k; j++){
for(int par = 0; par < 2; par++){
if(!dq[par].empty() && dq[par].front() < j - a[i] + 1)dq[par].pop_front();
while(!dq[par].empty() && mx[par][dq[par].back()] <= mx[par][j])dq[par].pop_back();
dq[par].push_back(j);
}
dp[i][j][0] = max(dp[i][j][0], mx[j&1][dq[j&1].front()] + j*g1 - (j/2)*g2);
}
for(int par = 0; par < 2; par++){
dq[par].clear();
}
for(int j = 0; j <= k; j++){
mx[0][j] = dp[i - 1][j][0] - j*g1 + ((a[i] + j - 1)/2)*g2;
mx[1][j] = dp[i - 1][j][0] - j*g1 + ((a[i] + j)/2)*g2 - g2;
}
for(int j = 0; j <= k; j++){
for(int par = 0; par < 2; par++){
if(!dq[par].empty() && dq[par].front() < j - a[i] + 1)dq[par].pop_front();
while(!dq[par].empty() && mx[par][dq[par].back()] <= mx[par][j])dq[par].pop_back();
dq[par].push_back(j);
}
dp[i][j][1] = max(dp[i][j][1], mx[j&1][dq[j&1].front()] + j*g1 - (j/2)*g2);
}
if(a[i] == 1)continue;
for(int par = 0; par < 2; par++){
dq[par].clear();
}
for(int j = 0; j <= k; j++){
mx[0][j] = dp[i - 1][j][1] + g3 - j*g1 + ((a[i] + j)/2)*g2 - g2;
mx[1][j] = dp[i - 1][j][1] + g3 - j*g1 + ((a[i] + j - 1)/2)*g2 - g2;
}
for(int j = 0; j <= k; j++){
for(int par = 0; par < 2; par++){
if(!dq[par].empty() && dq[par].front() < j - a[i] + 2)dq[par].pop_front();
while(!dq[par].empty() && mx[par][dq[par].back()] <= mx[par][j])dq[par].pop_back();
dq[par].push_back(j);
}
dp[i][j][1] = max(dp[i][j][1], mx[j&1][dq[j&1].front()] + j*g1 - (j/2)*g2);
}
}
cout<<dp[m][k][0]<<'\n';
return 0;
}