CF-1895 C-Torn Lucky Ticket

文章讲述了如何通过编程解决彩票问题,关注字符串长度、代数和的计算,运用数据结构如map和数组进行存储和计数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

幸运彩票的条件为,两个字符串拼接后前半段和后半段的代数和相同

思路:

由于每个字符窜的长度最大不超过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';
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值