题目:
思路:首先我们先计算一下长度相同并且数字和相同的。然后我们枚举每个字符串,为了不重复答案,我们取长度比他小的字符串合并。
我们可以看这个图,我们的目标是,x+y=n+z还有n+x=y+z,我们发现y一直是属于自己的,两个头会截取到另一个字符串中。
代码:
#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
#define endl '\n'
#define pq priority_queue
using namespace std;
typedef pair<int,int> pii;
string a[200010];
void solve(){
int n;cin>>n;
vector<string>s(n);
map<pair<int,int>,int>count;
int ans=0;
for(int i=0;i<n;i++){
cin>>s[i];
int sum=0,len=s[i].size();
for(char c:s[i])
sum+=c-'0';
ans+=count[{len,sum}];
count[{len,sum}]++;
}
ans=ans*2+n;
for (auto si : s) {
int m = si.size();
for (int i = 1; i * 2 < m; i += 1) {
int diff = 0, mid = 0, len = m - 2 * i;
for (int j = 0; j < m; j += 1) {
if (j < i) {
diff += si[j] - '0';
} else if (j >= m - i) {
diff -= si[j] - '0';
} else {
mid += si[j] - '0';
}
}
ans += count[{len, mid + diff}];
ans += count[{len, mid - diff}];
}
}
cout << ans;
}
signed main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t;cin>>t;
while(t--)
{
solve();
}
return 0;
}