#include<bits/stdc++.h>
#define lfor(i,a,b) for(int i=a;i<=b;i++)
#define int long long
using namespace std;
int pref[10][50][50][10];
signed main(){
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
ios::sync_with_stdio(false);
int n;
cin >> n;
string s[n + 10];
for(int i = 1;i <= n;i++) cin >> s[i];
for(int i = 1;i <= n;i++){
int k = 0;
int len = s[i].size();
for(int j = 0;j < len;j++) k += s[i][j] - '0';
int t = 0;
for(int j = 0;j < len;j++) t += s[i][j] - '0',pref[len][k][t][j + 1]++;
}
int sum = n;
for(int i = 1;i <= 5;i++){
for(int j = 1;j <= 5;j++){
if((i + j) % 2 != 0) continue;
int len = (i + j) / 2;
for(int ksum = 2;ksum <= 90;ksum += 2){
int val = ksum / 2;
for(int k1 = 1;k1 <= 45;k1++){
int k2 = ksum - k1;
if(k2 > 45) continue;
if(i > j and k1 > val){
sum += pref[i][k1][val][len] * pref[j][k2][k2][j];
}
else if(i == j and k1 == val){
int c = pref[i][k1][k1][i];
sum += c * (c - 1);
}
else if(i < j and k1 < val){
sum += pref[i][k1][k1][i] * pref[j][k2][k2-val][len-i];
}
}
}
}
}
cout << sum << endl;
return 0;
}
pref第一维代表串的长度,第二维代表串的总和,第四维代表串的前多少位,第三位代表前多少位的前缀和,pref的值代表这样的串有多少种。
接着进行两个串的拼接,i,j分别枚举长度,ksum枚举两串总和,k1枚举第一个串的总和。
而枚举量为5590*45 = 101250 = 1e5
过辽~