#include <climits>
#include <iostream>
#include <vector>
using namespace std;
//a 插入 b 删除 c替换
int min_edit_Distance(string s, string t ,int a,int b,int c)
{
int n = s.length();
int m = t.length();
//dp[i][j]: s串前i个字符变成 t串的前j个字符所需要的最小代价
//s[i-1] == t[j-1] 依赖dp[i-1][j-1]
//
// 1)s串前i-1个字符去搞定t串前j-1个字符(dp[i-1][j-1])+替换代价c
// 2)s串前i个字符去搞定t串的前j-1个字符(dp[i][j-1]) + 插入代价a
// 3)直接把s串最后一个字符删了,让s串前i-1个字符去搞定t串前j个字符(dp[i-1][j])+删除代价b
//base :第0行:s串0个字符去搞定t串 0....m个字符,直接插入就行
//第0列:s串 0....n个字符 去搞定t串0个字符,直接删除就行
vector<vector<int>> dp(n+1,vector<int>(m+1, INT_MAX));
for (int i = 0; i<=n; ++i)
{
dp[i][0] = i*a;
}
for (int j = 1; j<=m; ++j)
{
dp[0][j] = j*b;
}
for (int i = 1; i<=n; ++i)
{
for (int j = 1; j<=m; ++j)
{
if (s[i-1] == t[j-1])
{
dp[i][j] = dp[i-1][j-1];
}
else {
int p1 = dp[i-1][j-1] + c;
int p2 = dp[i][j-1] + a;
int p3 = dp[i-1][j] + b;
dp[i][j] = min(p1,min(p2,p3));
}
}
}
return dp[n][m];
}
int main() {
string s,t;
cin >> s >> t;
cout << min_edit_Distance(s, t, 1, 1, 1);
}
// 64 位输出请用 printf("%lld")