题意:
幸运彩票的条件为,两个字符串拼接后前半段和后半段的代数和相同
思路:
由于每个字符窜的长度最大不超过5,因此可以暴力分析所有情况
- 相同长度的字符串拼接
- 相同奇偶性的字符窜拼接
用map数组存储每种长度字符串下,所有位数字代数和为某一值的字符串个数
用一个三维数组a[i][p][n]存储第p个长度为i的字符串,前n位数字的代数和
#define int long long
int a[6][200002][6] = { 0 };
void solve() {
int n;
cin >> n;
int p = 0;
int pl[6] = { 0 };
map<int, int> mp[6];
for (int i = 0; i < n; i++)
{
string s;
cin >> s;
int sum = 0;
int q = 0;
for (auto x : s)
{
sum += x - '0';
a[s.size()][pl[s.size()]][q++]=sum;
}
mp[s.size()][sum]++;
pl[s.size()]++;
}
int ans = 0;
for (int i = 1; i <= 5; i++)
{
for (int u=0;u<pl[i];u++)
ans += mp[i][a[i][u][i - 1]];
}
for (int i = 0; i < pl[4]; i++)
{
ans += mp[2][a[4][i][2] - a[4][i][3] + a[4][i][2]];
ans += mp[2][a[4][i][3] - a[4][i][0] - a[4][i][0]];
}
for (int x = 1; x <= 3; x += 2)
{
if (pl[x] == 0)
continue;
for (int y = x + 2; y <= 5; y += 2)
{
if (pl[y] == 0)
continue;
for (int i = 0; i < pl[y]; i++)
{
int len1 = x;
int len2 = y;
int len = (x + y) / 2;
ans += mp[x][a[y][i][len - 1] - a[y][i][len2 - 1] + a[y][i][len - 1]];
ans += mp[x][a[y][i][len2 - 1] - a[y][i][len - len1 - 1] - a[y][i][len - len1 - 1]];
}
}
}
cout << ans << '\n';
}