//#include<bits/stdc++.h>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <stack>
#include <cmath>
#include <queue>
#include <string>
#include<climits>
#include<set>
#include<list>
#include<sstream>
using namespace std;
#define mod 1000000007
#define tr(c,i) for(auto i=(c).begin(); i != (c).end(); i++)
#define rep(i,n) for(int i=0;i<(n);i++)
#define forup(i,a,b) for(int i=(a);i<=(b);i++)
#define tcsolve() int tcs; cin >> tcs; forup(tc, 1, tcs) solve();
#define mp(a,b) make_pair(a,b)
inline void gi(int &x) {
register int c = getchar();
x = 0;
int neg = 0;
for (; ((c<48 || c>57) && c != '-'); c = getchar());
if (c == '-') {
neg = 1;
c = getchar();
}
for (; c>47 && c<58; c = getchar()) {
x = (x << 1) + (x << 3) + c - 48;
}
if (neg)
x = -x;
}
inline void print(int a){ char s[20]; int i = 0; do{ s[i++] = a % 10 + '0'; a /= 10; } while (a); i--; while (i >= 0)putchar(s[i--]); putchar('\n'); }
void solve()
{
string str1, str2, ans;
int mp[1000];
rep(i, 100)
{
mp[i] = 0;
}
cin >> str1 >> str2;
int yay=0, woops=0;
rep(i, str2.length())
{
mp[str2[i]]++;
}
rep(i, str1.length())
{
if (mp[str1[i]] > 0)
{
yay++;
mp[str1[i]]--;
}
else
{
if (str1[i] >= 'a' && str1[i] <= 'z')
{
if (mp[str1[i] - 'a' + 'A'] > 0)
{
woops++;
mp[str1[i] - 'a' + 'A']--;
}
}
else if (str1[i] >= 'A' && str1[i] <= 'Z')
{
if (mp[str1[i] + 'a' - 'A'] > 0)
{
woops++;
mp[str1[i] + 'a' - 'A']--;
}
}
}
}
cout << yay << " " << woops << "\n";
}
int main()
{
solve();
}
Ly8jaW5jbHVkZTxiaXRzL3N0ZGMrKy5oPgojaW5jbHVkZSA8Y3N0ZGlvPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxzZXQ+CiNpbmNsdWRlIDxtYXA+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxjc3RkbGliPgojaW5jbHVkZSA8Y3RpbWU+CiNpbmNsdWRlIDxzdGFjaz4KI2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlPGNsaW1pdHM+CiNpbmNsdWRlPHNldD4KI2luY2x1ZGU8bGlzdD4KI2luY2x1ZGU8c3N0cmVhbT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgbW9kIDEwMDAwMDAwMDcKI2RlZmluZSB0cihjLGkpIGZvcihhdXRvIGk9KGMpLmJlZ2luKCk7IGkgIT0gKGMpLmVuZCgpOyBpKyspCiNkZWZpbmUgcmVwKGksbikgZm9yKGludCBpPTA7aTwobik7aSsrKQojZGVmaW5lIGZvcnVwKGksYSxiKSBmb3IoaW50IGk9KGEpO2k8PShiKTtpKyspCiNkZWZpbmUgdGNzb2x2ZSgpIGludCB0Y3M7IGNpbiA+PiB0Y3M7IGZvcnVwKHRjLCAxLCB0Y3MpIHNvbHZlKCk7CiNkZWZpbmUgbXAoYSxiKSBtYWtlX3BhaXIoYSxiKQoKaW5saW5lIHZvaWQgZ2koaW50ICZ4KSB7CglyZWdpc3RlciBpbnQgYyA9IGdldGNoYXIoKTsKCXggPSAwOwoJaW50IG5lZyA9IDA7CgoJZm9yICg7ICgoYzw0OCB8fCBjPjU3KSAmJiBjICE9ICctJyk7IGMgPSBnZXRjaGFyKCkpOwoKCWlmIChjID09ICctJykgewoJCW5lZyA9IDE7CgkJYyA9IGdldGNoYXIoKTsKCX0KCglmb3IgKDsgYz40NyAmJiBjPDU4OyBjID0gZ2V0Y2hhcigpKSB7CgkJeCA9ICh4IDw8IDEpICsgKHggPDwgMykgKyBjIC0gNDg7Cgl9CgoJaWYgKG5lZykKCQl4ID0gLXg7Cn0KaW5saW5lIHZvaWQgcHJpbnQoaW50IGEpeyBjaGFyIHNbMjBdOyBpbnQgaSA9IDA7IGRveyBzW2krK10gPSBhICUgMTAgKyAnMCc7IGEgLz0gMTA7IH0gd2hpbGUgKGEpOyBpLS07IHdoaWxlIChpID49IDApcHV0Y2hhcihzW2ktLV0pOyBwdXRjaGFyKCdcbicpOyB9Cgp2b2lkIHNvbHZlKCkKewoJc3RyaW5nIHN0cjEsIHN0cjIsIGFuczsKCWludCBtcFsxMDAwXTsKCXJlcChpLCAxMDApCgl7CgkJbXBbaV0gPSAwOwoJfQoJY2luID4+IHN0cjEgPj4gc3RyMjsKCWludCB5YXk9MCwgd29vcHM9MDsKCXJlcChpLCBzdHIyLmxlbmd0aCgpKQoJewoJCW1wW3N0cjJbaV1dKys7Cgl9CglyZXAoaSwgc3RyMS5sZW5ndGgoKSkKCXsKCQlpZiAobXBbc3RyMVtpXV0gPiAwKQoJCXsKCQkJeWF5Kys7CgkJCW1wW3N0cjFbaV1dLS07CgkJfQoJCWVsc2UKCQl7CgkJCWlmIChzdHIxW2ldID49ICdhJyAmJiBzdHIxW2ldIDw9ICd6JykKCQkJewoJCQkJaWYgKG1wW3N0cjFbaV0gLSAnYScgKyAnQSddID4gMCkKCQkJCXsKCQkJCQl3b29wcysrOwoJCQkJCW1wW3N0cjFbaV0gLSAnYScgKyAnQSddLS07CgkJCQl9CgkJCX0KCQkJZWxzZSBpZiAoc3RyMVtpXSA+PSAnQScgJiYgc3RyMVtpXSA8PSAnWicpCgkJCXsKCQkJCWlmIChtcFtzdHIxW2ldICsgJ2EnIC0gJ0EnXSA+IDApCgkJCQl7CgkJCQkJd29vcHMrKzsKCQkJCQltcFtzdHIxW2ldICsgJ2EnIC0gJ0EnXS0tOwoJCQkJfQoJCQl9CgkJfQoJfQoJY291dCA8PCB5YXkgPDwgIiAiIDw8IHdvb3BzIDw8ICJcbiI7Cgp9CgppbnQgbWFpbigpCnsKCXNvbHZlKCk7Cn0KCg==