#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; }