#include <bits/stdc++.h>
#define ll long long
#define sti string
#define bit(n,i) ((n>>i) &1)
#define itachi ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define maxn 2000005
#define fi first
#define se second
#define int long long
using namespace std;
vector<int> dp;
int n,A,B;
int kmp[maxn];
sti X,Y;
void sub1(){
int cnt=0;
if(X != Y) cnt=max(A,B);
else cnt=A+B;
cout<<n*cnt;
}
void sub2(){
int cntX=n-(int)X.size()+1;
int cntY=n-(int)Y.size()+1;
cout<<cntX*A+cntY*B;
}
void sub3(){
dp.resize(n+1,0);
dp[0]=0;
for(int i=min(X.size(),Y.size());i<=n;i++){
if(i>=X.size()) dp[i]=max(dp[i-X.size()]+A,dp[i]);
if(i>=Y.size()) dp[i]=max(dp[i-Y.size()]+B,dp[i]);
}
cout<<dp[n];
}
int getlap(string S, string T) {
int m = S.size();
int n = T.size();
string p = " " + S; // Pattern
string t = " " + T; // Text
vector<int> pi(m + 1, 0);
// Bước 1: Xây dựng mảng tiền tố pi cho Pattern S
for (int i = 2, k = 0; i <= m; i++) {
while (k > 0 && p[i] != p[k + 1]) k = pi[k];
if (p[i] == p[k + 1]) k++;
pi[i] = k;
}
// Bước 2: Khớp Pattern S vào Text T
int k = 0;
for (int i = 1; i <= n; i++) {
while (k > 0 && t[i] != p[k + 1]) k = pi[k];
if (t[i] == p[k + 1]) k++;
// Nếu khớp hoàn toàn (k == m), ta cần lùi về để tìm overlap tiếp theo
// vì ta đang tìm hậu tố khớp tiền tố, không phải tìm xâu con đơn thuần.
if (k == m && i < n) k = pi[k];
}
// Nếu là tự khớp (getlap(X, X)), k có thể bằng m (nguyên xâu).
// Ta chỉ lấy overlap thật sự nhỏ hơn độ dài xâu.
if (k == m) return pi[m];
return k;
}
void sub5(){
int k=kmp[1]=0;
int m=X.size();
X=' '+X;
for(int i=2;i<=m;i++){
while(k>0 && X[i]!=X[k+1]) k=kmp[k];
kmp[i]=(X[i]==X[k+1] ? ++k : 0);
}
int lap=m-kmp[m];
int cnt=1+(n-m)/lap;
cout<<cnt*(A+B);
}
void sub4() {
int L = X.size();
// costXX: Đang có X, viết thêm bao nhiêu ký tự để lại có X
// getlap(X, X) tìm tiền tố X khớp hậu tố X
ll costXX = L - getlap(X, X);
// costXY: Đang có X, viết thêm bao nhiêu ký tự để có Y
// Cần tìm tiền tố Y khớp hậu tố X -> dùng getlap(Y, X)
ll costXY = L - getlap(Y, X);
// costYY: Đang có Y, viết thêm bao nhiêu ký tự để lại có Y
ll costYY = L - getlap(Y, Y);
// costYX: Đang có Y, viết thêm bao nhiêu ký tự để có X
// Cần tìm tiền tố X khớp hậu tố Y -> dùng getlap(X, Y)
ll costYX = L - getlap(X, Y);
// Khai báo DP: 2 hàng, n+1 cột
// Nếu n=10^7, vector<vector<ll>> tốn ~160MB.
// Nếu giới hạn 64MB, bạn cần dùng mảng 1 chiều hoặc kỹ thuật khác.
vector<ll> d0(n + 1, -1);
vector<ll> d1(n + 1, -1);
if (L <= n) {
d0[L] = A;
d1[L] = B;
}
ll ans = 0;
for (int i = L; i <= n; i++) {
// Trường hợp đang đứng ở cuối một xâu X
if (d0[i] != -1) {
ans = max(ans, d0[i]);
// Nối tiếp X: X -> X
if (i + costXX <= n)
d0[i + costXX] = max(d0[i + costXX], d0[i] + A);
// Nối tiếp Y: X -> Y
if (i + costXY <= n)
d1[i + costXY] = max(d1[i + costXY], d0[i] + B);
}
// Trường hợp đang đứng ở cuối một xâu Y
if (d1[i] != -1) {
ans = max(ans, d1[i]);
// Nối tiếp X: Y -> X
if (i + costYX <= n)
d0[i + costYX] = max(d0[i + costYX], d1[i] + A);
// Nối tiếp Y: Y -> Y
if (i + costYY <= n)
d1[i + costYY] = max(d1[i + costYY], d1[i] + B);
}
}
cout << ans;
}
signed main()
{
itachi
//freopen("STRING.inp","r",stdin);
//freopen("STRING.out","w",stdout);
cin>>n>>A>>B;
cin>>X>>Y;
bool subtask2=1;
bool subtask3=(X[0]=='a' && Y[0]=='c');
for(char c : X) if(c!='a') subtask2=0;
for(char c : Y) if(c!='a') subtask2=0;
for(int i=1;i<X.size();i++) if(X[i]!='b') subtask3=0;
for(int i=1;i<Y.size();i++) if(Y[i]!='d') subtask3=0;
if(X.size()==1 && Y.size()==1) sub1();
else if(subtask2) sub2();
else if(subtask3) sub3();
else if(X==Y) sub5();
else if(X.size()==Y.size()) sub4();
return 0;
}