#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<int> zap(n);
for (int i = 0; i < n; i++) cin >> zap[i];
cin.ignore();
string tekst;
getline(cin, tekst);
int sp = 0, liczb = 0, slow = 0, zda = 0, pal = 0;
for (int i = 0; i < (int)tekst.size(); i++)
if (tekst[i] == ' ') sp++;
for (int i = 0; i < (int)tekst.size();) {
if (isdigit(tekst[i])) {
liczb++;
while (i < (int)tekst.size() && isdigit(tekst[i])) i++;
} else i++;
}
vector<string> wyrazy;
for (int i = 0; i < (int)tekst.size();) {
if (isalpha(tekst[i])) {
string tmp = "";
while (i < (int)tekst.size() && isalpha(tekst[i])) {
tmp += tekst[i];
i++;
}
wyrazy.push_back(tmp);
slow++;
} else i++;
}
string cz = "";
for (int i = 0; i < (int)tekst.size(); i++) {
char z = tekst[i];
if (z == '.') {
int ok = 0;
for (int j = 0; j < (int)cz.size(); j++)
if (isalpha(cz[j])) { ok = 1; break; }
if (ok) zda++;
cz = "";
} else cz += z;
}
for (int i = 0; i < (int)wyrazy.size(); i++) {
string a = wyrazy[i];
for (int j = 0; j < (int)a.size(); j++) a[j] = tolower(a[j]);
string b = a;
reverse(b.begin(), b.end());
if (a == b) pal++;
}
for (int i = 0; i < n; i++) {
if (zap[i] == 1) cout << sp;
else if (zap[i] == 2) cout << liczb;
else if (zap[i] == 3) cout << slow;
else if (zap[i] == 4) cout << zda;
else cout << pal;
cout << " ";
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgbWFpbigpIHsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7CgogICAgaW50IG47CiAgICBjaW4gPj4gbjsKICAgIHZlY3RvcjxpbnQ+IHphcChuKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSBjaW4gPj4gemFwW2ldOwogICAgY2luLmlnbm9yZSgpOwoKICAgIHN0cmluZyB0ZWtzdDsKICAgIGdldGxpbmUoY2luLCB0ZWtzdCk7CgogICAgaW50IHNwID0gMCwgbGljemIgPSAwLCBzbG93ID0gMCwgemRhID0gMCwgcGFsID0gMDsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpdGVrc3Quc2l6ZSgpOyBpKyspCiAgICAgICAgaWYgKHRla3N0W2ldID09ICcgJykgc3ArKzsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpdGVrc3Quc2l6ZSgpOykgewogICAgICAgIGlmIChpc2RpZ2l0KHRla3N0W2ldKSkgewogICAgICAgICAgICBsaWN6YisrOwogICAgICAgICAgICB3aGlsZSAoaSA8IChpbnQpdGVrc3Quc2l6ZSgpICYmIGlzZGlnaXQodGVrc3RbaV0pKSBpKys7CiAgICAgICAgfSBlbHNlIGkrKzsKICAgIH0KCiAgICB2ZWN0b3I8c3RyaW5nPiB3eXJhenk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpdGVrc3Quc2l6ZSgpOykgewogICAgICAgIGlmIChpc2FscGhhKHRla3N0W2ldKSkgewogICAgICAgICAgICBzdHJpbmcgdG1wID0gIiI7CiAgICAgICAgICAgIHdoaWxlIChpIDwgKGludCl0ZWtzdC5zaXplKCkgJiYgaXNhbHBoYSh0ZWtzdFtpXSkpIHsKICAgICAgICAgICAgICAgIHRtcCArPSB0ZWtzdFtpXTsKICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICB3eXJhenkucHVzaF9iYWNrKHRtcCk7CiAgICAgICAgICAgIHNsb3crKzsKICAgICAgICB9IGVsc2UgaSsrOwogICAgfQoKICAgIHN0cmluZyBjeiA9ICIiOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KXRla3N0LnNpemUoKTsgaSsrKSB7CiAgICAgICAgY2hhciB6ID0gdGVrc3RbaV07CiAgICAgICAgaWYgKHogPT0gJy4nKSB7CiAgICAgICAgICAgIGludCBvayA9IDA7CiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgKGludCljei5zaXplKCk7IGorKykKICAgICAgICAgICAgICAgIGlmIChpc2FscGhhKGN6W2pdKSkgeyBvayA9IDE7IGJyZWFrOyB9CiAgICAgICAgICAgIGlmIChvaykgemRhKys7CiAgICAgICAgICAgIGN6ID0gIiI7CiAgICAgICAgfSBlbHNlIGN6ICs9IHo7CiAgICB9CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KXd5cmF6eS5zaXplKCk7IGkrKykgewogICAgICAgIHN0cmluZyBhID0gd3lyYXp5W2ldOwogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgKGludClhLnNpemUoKTsgaisrKSBhW2pdID0gdG9sb3dlcihhW2pdKTsKICAgICAgICBzdHJpbmcgYiA9IGE7CiAgICAgICAgcmV2ZXJzZShiLmJlZ2luKCksIGIuZW5kKCkpOwogICAgICAgIGlmIChhID09IGIpIHBhbCsrOwogICAgfQoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgaWYgKHphcFtpXSA9PSAxKSBjb3V0IDw8IHNwOwogICAgICAgIGVsc2UgaWYgKHphcFtpXSA9PSAyKSBjb3V0IDw8IGxpY3piOwogICAgICAgIGVsc2UgaWYgKHphcFtpXSA9PSAzKSBjb3V0IDw8IHNsb3c7CiAgICAgICAgZWxzZSBpZiAoemFwW2ldID09IDQpIGNvdXQgPDwgemRhOwogICAgICAgIGVsc2UgY291dCA8PCBwYWw7CiAgICAgICAgY291dCA8PCAiICI7CiAgICB9Cn0K