#include <iostream>
#include <vector>
#include <unordered_map>
#include <cmath>
#include <stdlib.h>
#include <queue>
#include <set>
#include <algorithm>
#include <map>
#include <sstream>

using namespace std;
typedef long long ll;

// header
// template <typename T>
// string to_string(T o);
// template <typename T>
// string to_string(vector<T> v);
// template <typename T>
// string to_string(vector<vector<T>> m);
// template <typename K, typename V>
// string to_string(pair<K, V> p);
// template <typename K, typename V>
// string to_string(map<K, V> m);
// template <typename T>
// string to_string(set<T> ss);
// template <typename T>
// string to_string(queue<T> q);

// // 実装
// template <typename T>
// string to_string(T o)
// {
//   stringstream s;
//   s << o;
//   return s.str();
// }

// template <typename T>
// string to_string(vector<T> v)
// {
//   stringstream s;
//   s << "[";
//   for (auto i = 0; i < v.size(); i++)
//   {
//     s << to_string(v.at(i));
//     if (i != v.size() - 1)
//     {
//       s << ", ";
//     }
//   }
//   s << "]";
//   return s.str();
// }

// template <typename T>
// ostream &operator<<(ostream &o, const vector<T> &obj)
// {
//   o << to_string(obj);
//   return o;
// }

// template <typename T>
// string to_string(vector<vector<T>> m)
// {
//   stringstream s;
//   s << "[" << endl;
//   for (auto i = 0; i < m.size(); i++)
//   {
//     auto v = m[i];
//     s << "  "
//       << "#" << i << ":"
//       << " " << to_string(v);
//     s << ", " << endl;
//   }
//   s << "]";
//   return s.str();
// }

// template <typename T>
// ostream &operator<<(ostream &o, const vector<vector<T>> &obj)
// {
//   o << to_string(obj);
//   return o;
// }

// template <typename K, typename V>
// string to_string(pair<K, V> p)
// {
//   stringstream s;
//   s << "pair(" << to_string(p.first) << ", " << to_string(p.second) << ")";
//   return s.str();
// }

// template <typename K, typename V>
// ostream &operator<<(ostream &o, const pair<K, V> &obj)
// {
//   o << to_string(obj);
//   return o;
// }

// template <typename K, typename V>
// string to_string(map<K, V> m)
// {
//   stringstream s;
//   s << "{" << endl;
//   for (const auto &[key, value] : m)
//   {
//     s << "  " << to_string(key) << ": " << to_string(value) << "," << endl;
//   }
//   s << "}";
//   return s.str();
// }

// template <typename K, typename V>
// ostream &operator<<(ostream &o, const map<K, V> &obj)
// {
//   o << to_string(obj);
//   return o;
// }

// template <typename T>
// string to_string(set<T> ss)
// {
//   stringstream s;
//   s << "set"
//     << "{";
//   for (auto itr = ss.begin(); itr != ss.end(); itr++)
//   {
//     s << to_string(*itr);
//     if (next(itr, 1) != ss.end())
//     {
//       s << ", ";
//     }
//   }
//   s << "}";
//   return s.str();
// }

// template <typename T>
// ostream &operator<<(ostream &o, const set<T> &obj)
// {
//   o << to_string(obj);
//   return o;
// }

// template <typename T>
// string to_string(queue<T> q)
// {
//   auto temp = queue<T>{};
//   stringstream s;
//   s << "queue{";
//   while (!q.empty())
//   {
//     auto top = q.front();
//     s << to_string(top) << ", ";
//     q.pop();
//     temp.push(top);
//   }
//   s << "}";

//   while (!temp.empty())
//   {
//     auto top = temp.front();
//     temp.pop();
//     q.push(top);
//   }

//   return s.str();
// }

// template <typename T>
// ostream &operator<<(ostream &o, const queue<T> &obj)
// {
//   o << to_string(obj);
//   return o;
// }

int main()
{
  ll ans = 0;
  ll n, k;
  cin >> n >> k;
  ll r, s, p;
  cin >> r >> s >> p;
  string t;
  cin >> t;

  auto calc_point = [p, r, s](char h) {
    ll point;
    if (h == 'r')
    {
      point = p;
    }
    else if (h == 's')
    {
      point = r;
    }
    else if (h == 'p')
    {
      point = s;
    }
    return point;
  };

  vector<int> hands(n, -1);
  vector<int> points(n);
  vector<ll> win(n, 0);
  vector<ll> draw(n, 0);

  auto fix_hand = [&hands, win, draw, t, k](ll index) {
    // cout << "fix_hand" << endl;
    // k個前が違う.このときはk個前の内容をその時点で有利なものベースで確定できる.
    bool is_win = win.at(index) >= draw.at(index);
    ll hand = t.at(index);

    bool should_continue = false;
    do
    {
      hands.at(index) = is_win ? 1 : 0;
      should_continue = false;
      if (index - k >= 0 && t.at(index - k) == hand)
      {
        index -= k;
        is_win = !is_win;
        should_continue = true;
      }
    } while (should_continue);
  };

  for (ll i = 0; i < n; i++)
  {
    auto h = t.at(i);
    ll point = calc_point(h);
    points[i] = point;

    // cout << "i: " << i << endl;
    // k個前が存在している
    if (i - k >= 0)
    {
      // k個前が同じである.つまり今回においても確定できないとき
      if (t.at(i - k) == h)
      {
        win[i] = draw[i - k] + point;
        draw[i] = win[i - k];
      }
      else
      {
        win[i] = point;
        draw[i] = 0;
        fix_hand(i - k);
      }
    }
    else
    {
      // k個前が存在していないとき
      win[i] = point;
      draw[i] = 0;
    }
  }

  // cout << "handle: rest" << endl;

  for (auto i = n - 1; i >= 0; i--)
  {
    if (hands[i] == -1)
    {
      fix_hand(i);
    }
  }

  // cout << hands << endl;
  // cout << win << endl;
  // cout << draw << endl;
  // cout << points << endl;

  ll total = 0;
  for (auto i = 0; i < n; i++)
  {
    if (hands[i] == 1)
    {
      total += points[i];
    }
  }

  cout << total << endl;
}


Measured memory_bytes: 4416