#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;
}