#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
struct String_hash {
int mod = 1e9 + 7;
static int base;
vector<int> pre, p;
String_hash() {}
String_hash(string s) {
int n = s.size();
pre.resize(n + 1);
p.resize(n + 1);
p[0] = 1;
if (base == 0) {
mt19937 rng = mt19937(static_cast<unsigned int>(time(0)));
uniform_int_distribution<int> dist(100, 233);
base = dist(rng);
}
for (int i = 0; i < n; i++) {
p[i + 1] = 1LL * p[i] * base % mod;
pre[i + 1] = (1LL * pre[i] * base % mod + s[i] - 'a' + 1) % mod;
}
}
int get_hash(int l, int r) {
l++, r++;
return ((pre[r] - 1LL * pre[l - 1] * p[r - l + 1] % mod) % mod + mod) % mod;
}
};
int String_hash::base = 0;
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cout << fixed << setprecision(15);
int n;
cin >> n;
vector<string> s(n);
for (int i = 0; i < n; i++) {
int len;
cin >> len;
cin >> s[i];
}
sort(s.begin(), s.end(), [](string& a, string& b) {
return a.size() < b.size();
});
vector<String_hash> S(n), T(n);
for (int i = 0; i < n; i++) {
S[i] = String_hash(s[i]);
string t = s[i];
reverse(t.begin(), t.end());
T[i] = String_hash(t);
}
map<int, int> cnt;
int res = 0;
for (int i = 0; i < n; i++) {
int len = s[i].size();
cnt[S[i].get_hash(0, len - 1)]++;
res += cnt[T[i].get_hash(0, len - 1)];
for (int j = 0; j < len - 1; j++) {
int l1 = 0, r1 = j;
int l2 = len - 1 - j, r2 = len - 1;
if (S[i].get_hash(l1, r1) == T[i].get_hash(l2, r2)) {
res += cnt[T[i].get_hash(0, len - 2 - j)];
}
}
}
cnt.clear();
for (int i = 0; i < n; i++) {
int len = s[i].size();
cnt[T[i].get_hash(0, len - 1)]++;
res += cnt[S[i].get_hash(0, len - 1)];
for (int j = 1; j < len; j++) {
int l1 = j, r1 = len - 1;
int l2 = 0, r2 = len - j - 1;
if (S[i].get_hash(l1, r1) == T[i].get_hash(l2, r2)) {
res += cnt[S[i].get_hash(0, j - 1)];
}
}
}
for (int i = 0; i < n; i++) {
int len = s[i].size();
if (S[i].get_hash(0, len - 1) == T[i].get_hash(0, len - 1)) {
res--;
}
}
cout << res << endl;
return 0;
}