#include <bits/stdc++.h>
using namespace std;
array<long long, 26> countNeed(const string& p) {
array<long long, 26> need{};
need.fill(0);
for (char ch : p) {
char c = tolower((unsigned char)ch);
need[c - 'a']++;
}
return need;
}
int main() {
string s, a, b;
cin >> s >> a >> b;
// 库存
array<long long, 26> cnt{};
cnt.fill(0);
for (char ch : s) cnt[ch - 'a']++;
auto needA = countNeed(a);
auto needB = countNeed(b);
// 计算最多能做多少份 a(作为枚举上界)
auto maxCopies = [&](const array<long long, 26>& need)->long long{
long long lim = (long long)1e18;
for (int c = 0; c < 26; c++) {
if (need[c]) lim = min(lim, cnt[c] / need[c]);
}
if (lim == (long long)1e18) return 0; // 模式长度>=1,正常不会到这
return lim;
};
long long maxA = maxCopies(needA);
long long best = 0;
for (long long x = 0; x <= maxA; ++x) {
// 剩余库存
array<long long, 26> left = cnt;
bool ok = true;
for (int c = 0; c < 26; c++) {
left[c] -= x * needA[c];
if (left[c] < 0) {
ok = false;
break;
}
}
if (!ok) break; // x 再增大只会更差
// 尽量做 b
long long y = (long long)1e18;
bool anyB = false;
for (int c = 0; c < 26; c++) {
if (needB[c]) {
anyB = true;
y = min(y, left[c] / needB[c]);
}
}
if (!anyB) y = 0; // b 长度至少为1,通常不会发生
best = max(best, x + y);
}
cout << best << '\n';
return 0;
}