首页 > 其他分享 >ABC295D 题解

ABC295D 题解

时间:2024-03-01 22:35:29浏览次数:13  
标签:题解 复杂度 ABC295D 异或 区间 oplus xorsum

萌萌思维题,但是考场差一点AC。


题目等价于寻找区间 \([l,r]\) 满足数字 \(0\)~\(9\) 各出现偶数次。

根据
找筷子
这道题的经验,出现偶数次 = 异或和为 \(0\) 。

但是发现如果和找筷子一样直接异或到一起会出现冲突
(例子:$3 \oplus 5 \oplus 6 = 0 $)。

所以变成二进制数就可以了。


朴素想法是暴力枚举每个区间,然后异或判断。复杂度 \(O(|S|^3)\),显然无法通过本题。

利用前缀和进行优化,可以把复杂度降到 \(O(|S|^2)\),仍然不能通过本题。


由于题目要求的只是数量,不需要求出每个区间。

考虑满足条件的 \([l,r]\) 区间性质,必满足 \(xorsum_{l-1} = xorsum_{r}\)。

那么求 \(xorsum\) 时记录当前值的出现次数 \(cnt_x\),以 \(r\) 为右端点,满足条件的 \(l\) 数量是 \(cnt_x - 1\),也就是区间数量。

累加即可。


code:

#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=1;i<=n;i++)
#define LL long long

const int N=5e5+5;
int a[N],m[N];
int cnt;
LL ans;//不开long long见祖宗

int main()
{
	while(char c=getchar()){
		if(isdigit(c)) a[++cnt]=c-'0';
		else break;
	}
	int x=0;
	m[0]=1;//处理以1为左端点的情况
	rep(i,cnt){
		x^=(1<<a[i]);//状压
		ans+=m[x];
		m[x]++;
	}
	cout<<ans<<endl;
	return 0;
}


标签:题解,复杂度,ABC295D,异或,区间,oplus,xorsum
From: https://www.cnblogs.com/Cindy-Li/p/18048092

相关文章

  • ABC321F 题解
    可撤销背包的模板题。如果没有减操作就是\(01\)背包,众所周知转移方程是\(f[i]=f[i]+f[i-v]\)。考虑减操作,对于一个重量\(i\),不选物品\(v\)的方案数是什么呢?发现我们只需要把选\(v\)的方案去掉就好,那么转移方程就是\(f[i]=f[i]-f[i-v]\)。于是就做完了。注意取模变正......
  • ABC323D 题解
    这个题笔者场上Wa了六次……首先发现一个性质:考虑单个的\(s\),它自己所能合并成的块就是\(c\)的二进制表示。例如当\(s=3,c=7\)时,显然我们可以先两两合并,得到\(3\)个\(s=6\)的,再把其中的两个合并得到一个\(s=12\)的。发现\(7=(111)_2\),正好最终只有三个块:\(s=3,......
  • P3749 题解
    P3749[六省联考2017]寿司餐厅题解发现很少有人讲为什么这题是最大权闭合子图,但作为一个刚学网络流的蒟蒻,我认为考虑是必要的。最大权闭合子图的特点:存在单向依赖关系,选\(x\)必须选\(y\)。每个点只会被选一次。代价有正有负。本问题特点:选一个区间,必选所有子区间(......
  • ABC338G 题解
    ABC338G题解计数题,没有太多思维难度,就是麻烦。显然+和*是比较难搞的,应考虑子问题。复杂度要求线性,考虑每个位置的贡献。Case1:只有数字Ex:1234考虑2的贡献,枚举一下看看。\(12=1\times10+2\times1\)\(123=1\times100+2\times10+3\times1\)\(1234=\dots\)\(2=2......
  • [ABC217F] Make Pair 题解
    [ABC217F]MakePair题解思路解析通过\(n\le200\)和“选出的两个学生离开队列,空出来的位置左右合拢”这两个细节可以想到能用区间dp做,\(f_{i,j}\)表示将\(i\toj\)这个区间全部选完的方案数,然后常规区间dp,加一个判断如果当前区间\([l,r]\)中\(l,r\)是朋友,就可......
  • P4690 [Ynoi2016] 镜中的昆虫 题解
    题目链接:镜中的昆虫经典题了,我们首先回顾下颜色数的常见做法统计:对每个位置维护一个\(pre_i\),表示与当前位置相同的颜色上一次出现位置。那么我们分讨一下。查询\([l,r]\)得到颜色数,对于\(pre_i<l\)的\(i\)点,显然它就是这个区间内\(a_i\)对应颜色出现的第一个位置,我们......
  • window.open 循环下载多个文件会打开新页签问题解决
     批量下载文件,循环使用window.open(url)的方式会打开新页签,参考了一位大侠的文章,使用iframe可以的:https://blog.csdn.net/nanke_yh/article/details/125145717如下:fileList.forEach(file=>{//同时下载多个文件,使用iframe下载,因为window.open或者a......
  • $\text{20240301}$ 字符串练习题解
    \(\text{20240301}\)字符串练习题解一定要写冬令营的题吗?遗憾的。P9717给了一个\(n\)个数的首尾相接的字符串,求若干个操作后能形成的不同的字符串大小。一次操作定义为:将字符串内所有的\(\text{01}\)同时改成\(\text{10}\),如图。通过这张图我们似乎发现了一个规律,这......
  • CF1937D Pinball 题解
    题目链接:https://codeforces.com/contest/1937/problem/D题意简述一个长为n的格子,用'<'或'>'组成的字符串表示,在位置i放一个小球,当前所在位置是'<'则下一秒左移一步,否则下一秒右移一步。小球移动后,之前位置的符号反转,'<'变成'>','>'变成'<',直到小球离开整个......
  • [CF1804F] Approximate Diameter 题解
    题目链接题目分析显然图结构不太好维护,容易想到维护树结构。维护生成树看起来就不太靠谱,容易想到维护最短路树。keyobservation:我们固定一个端点(不妨为\(1\)),求出这个点到每个点的最短路长度的最大值\(x\)。则一定有\(\lceil{d\over2}\rceil\lex\led\)。证明:显然\(x\l......