#include <bits/stdc++.h>
using namespace std;
int N;
int memo[5005];
int reach[5005];
int lps[5005];
int c1, c2;
string init;
void compute(string &B) {
  int len = 0, i = 1;
  int M = B.size();
  lps[0] = 0;
  while (i < M) {
    if (B[i] == B[len]) {
      len++;
      lps[i] = len;
      i++;
    } else {
      if (len != 0) {
        len = lps[len - 1];
      } else {
        lps[i] = 0;
        i++;
      }
    }
  }
}
bool is_sub(string &A, int N, string &B) {
  int M = B.size();
  compute(B);
  int i = 0, j = 0;
  while (i < N) {
    if (A[i] == B[j]) {
      i++, j++;
    }
    if (j == M) {
      return 1;
    } else if (i < N && A[i] != B[j]) {
      if (j != 0) {
        j = lps[j - 1];
      } else {
        i++;
      }
    }
  }
  return 0;
}
void precompute_sub() {
  reach[0] = -1;
  for (int i = 1; i < N; i++) {
    int l = i, r = min((i << 1) - 1, N - 1);
    reach[i] = -1;
    while (l <= r) {
      int mid = (l + r) >> 1;
      string tmp = init.substr(i, mid - i + 1);
      if (is_sub(init, i, tmp)) {
        l = mid + 1;
        reach[i] = mid;
      } else
        r = mid - 1;
    }
  }
}
int dp(int now) {
  if (now >= N) return 0;
  if (memo[now] != -1) return memo[now];
  int res = 1000000000;
  res = min(res, dp(now + 1) + c1);
  for (int i = now; i <= reach[now]; i++) {
    res = min(res, dp(i + 1) + c2);
  }
  return memo[now] = res;
}
int main() {
  ios_base::sync_with_stdio(0);
  memset(memo, -1, sizeof(memo));
  cin >> N >> c1 >> c2 >> init;
  precompute_sub();
  cout << dp(0) << "\n";
}
