#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
const int M = 30;
const int inf = 0x3f3f3f3f;
struct state {
  int len, link, pos, mpos;
  int next[M];
} st[N];
int sz, last;
void sa_init() {
  sz = 1, last = 0;
  st[0].len = 0;
  st[0].link = -1;
}
void sa_extend(int c) {
  int r = sz++;
  st[r].len = st[last].len + 1;
  st[r].pos = st[r].len;
  int p = last;
  while (p != -1 && !st[p].next[c]) st[p].next[c] = r, p = st[p].link;
  if (p == -1)
    st[r].link = 0;
  else {
    int q = st[p].next[c];
    if (st[q].len == st[p].len + 1)
      st[r].link = q;
    else {
      int qq = sz++;
      st[qq].link = st[q].link;
      memcpy(st[qq].next, st[q].next, sizeof(st[q].next));
      st[qq].len = st[p].len + 1;
      st[qq].pos = inf;
      while (p != -1 && st[p].next[c] == q) st[p].next[c] = qq, p = st[p].link;
      st[q].link = st[r].link = qq;
    }
  }
  last = r;
}
int tmp[N], tp[N];
void get_topo() {
  memset(tmp, 0, sizeof(tmp));
  for (int i = 0; i < sz; i++) tmp[st[i].len]++;
  for (int i = 1; i < sz; i++) tmp[i] += tmp[i - 1];
  for (int i = 0; i < sz; i++) tp[--tmp[st[i].len]] = i;
}
void calc_siz() {
  get_topo();
  for (int i = 0; i < sz; i++) st[i].mpos = st[i].pos;
  for (int i = sz - 1; i > 0; i--)
    st[st[tp[i]].link].mpos = min(st[st[tp[i]].link].mpos, st[tp[i]].mpos);
}
long long dp[N];
char s[N];
int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  int n;
  long long a, b;
  cin >> n >> a >> b;
  cin >> s + 1;
  sa_init();
  for (int i = 1; i <= n; i++) sa_extend(s[i] - 'a');
  calc_siz();
  memset(dp, 0x3f, sizeof(dp));
  dp[1] = a;
  int p = 0;
  st[0].mpos = 1, st[0].len = 0;
  for (int i = 1; i <= n; i++) {
    p = st[p].next[s[i] - 'a'];
    dp[i] = min(dp[i], dp[i - 1] + a);
    int t = p;
    for (int l = i - 1; l >= 1; l--) {
      while (st[st[t].link].len >= l) t = st[t].link;
      if (t && st[t].mpos <= i - l) dp[i] = min(dp[i], dp[i - l] + b);
    }
  }
  cout << dp[n] << endl;
}
