#include <bits/stdc++.h>
using namespace std;
const long long INF = INT_MAX;
const long long INFll = LLONG_MAX;
const long long mod = 1000000000 + 7;
void solveA();
void solveB();
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  solveA();
  return 0;
}
struct hashs {
  unsigned int cnt;
  int maxpow;
  long long pow = 257;
  vector<long long> pref;
  vector<long long> pows;
  explicit hashs() : cnt(0) {}
  explicit hashs(string inp) {
    cnt = inp.length();
    pref.resize(inp.length() + 1);
    pows.resize(inp.length() + 1);
    pows[0] = 1;
    maxpow = inp.length();
    for (int i = 1; i <= inp.length(); i++) pows[i] = (pows[i - 1] * pow) % mod;
    for (int i = 0; i < inp.length(); i++)
      pref[i + 1] = (pref[i] + (inp[i] - 'a' + 1) * pows[i]) % mod;
  }
  bool isSame(int i, int j, int len) {
    long long hashA = ((pref[i + len - 1] - pref[i - 1] + mod) % mod);
    long long hashB = ((pref[j + len - 1] - pref[j - 1] + mod) % mod);
    hashA = (hashA * pows[maxpow - i]) % mod;
    hashB = (hashB * pows[maxpow - j]) % mod;
    return (hashA == hashB);
  }
};
hashs str;
bool possible(int k, int m) {
  for (int i = 1; i + m <= k; i++) {
    if (str.isSame(i, k, m)) return true;
  }
  return false;
}
void solveA() {
  int N, A, B;
  cin >> N >> A >> B;
  string inp;
  cin >> inp;
  str = hashs(inp);
  vector<int> suff((unsigned)N + 1);
  int ans = 0;
  for (int i = 1; i <= N; i++) {
    int l = 0, r = N - i + 2, m;
    while (r - l > 1) {
      m = (l + r) / 2;
      if (possible(i, m))
        l = m;
      else
        r = m;
    }
    suff[i] = l;
  }
  vector<int> dp((unsigned)N + 1, INF);
  dp[0] = 0;
  for (int i = 1; i <= N; i++) {
    dp[i] = min(dp[i], dp[i - 1] + A);
    for (int j = 1; j <= suff[i]; j++)
      dp[i + j - 1] = min(dp[i + j - 1], dp[i - 1] + B);
  }
  cout << dp[N];
}
void solveB() {}
