思路讲解
AC代码
AC
https://vjudge.net/solution/58198800
1 | // Problem: A/B |
AC
https://vjudge.net/solution/58198800
1 | // Problem: A/B |
【牛客寒假集训营第四场讲题】 【精准空降到 2:13:15】 https://www.bilibili.com/video/BV1TxN8eKEQY/?share_source=copy_web&vd_source=6ca0bc05e7d6f39b07c1afd464edae37&t=7995
这个题解可以理解为该视频讲解的笔记
其实异或很简单,不就是相同的相消嘛,所以说对数值有贡献的就只有1是吧,那么把1消掉嘛,剩下的1就是我们要求的值了
道理是比较简单的,就是如果A[i]的这位是0,我们就想知道B[i~r]这位有多少个1,反之,如果A[i]的这位是1,B[i~r]这位有多少个0,统计好以后使用权值进行计算
然后知道了这个道道,但怎么样在O(1)的时间内实现这个查询那?需要用到后缀和的前缀和

代码中的ssumB就是代指这个三角形(整体来看是三角形,分序号来看是梯形),ssumB[i][j]如下图所示(第j位是指数位,第i位是指A[i],B[i])

查询就是查中间这个小三角形,于是我们用大梯形-小梯形-矩形就好了

我们还是要细化一下,这个矩形是怎么求的?还是前缀和?(也不是不行,但是二维前缀和可能MLE了)
我们可以直接用乘法,用a里1的个数乘以b里0的个数就(都是指在数位1里的情况)可以了。

这个长方形计算其实也不容易
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=75503543
1 | // Problem: Tokitsukaze and XOR-Triangle |
这个是有点问题的,因为前缀和没有根据A在这位的值进行变化
1 | // Problem: Tokitsukaze and XOR-Triangle |
当时在赛场上想到了前缀和+前缀和的思路,但是我没想到按位推导的思路,所以就卡住了,在那边疯狂打表找规律,自然看不出来什么~~(数感不行)~~

https://www.luogu.com/article/wa8c5zfe 还有一种差分想法,更加简洁,挺好的
10就是在差分数组中有一个-1,01就是差分数组中有一个1,把差分数组加起来,就能得到01数量-10数量的值,然后根据差分的结论,我们就知道差分总值只和首项和末项有关。
首先根据上题,我们需要发现两个结论:
1) 首尾相同的字符串一定是平衡的。
2) 首尾不相同的字符串一定是不平衡的。
这是为什么那?
直接证明这个结论比较难,可以这么想,大家可以想象一个都是0序列,将里面的0变为1(通过这一操作可以生成任何序列)会对10,01数量造成什么变化那?(其实我也不是很会证明,大家就随便看看吧)

我们发现,只有在对空情况的操作时,才会产生不平衡这样的问题
而且对空情况的左右两种镜像情况分别为一组,这两组中的任意两对都是互相抵消的(比如10++ && 01++ 就会使数列平衡)
那么其实就完成了,头尾都是0的情况嘛所有操作都使数列保持平衡,头尾都是1的情况对空操作也就抵消了,那么就得到了上述的结论。
有了这个结论以后剩下的就简单了,剩下的就看代码吧,关键地方有注释,然后注意特判只有单个字母的情况。
AC
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=75411197
1 | // Problem: Tokitsukaze and Balance String (hard) |
如同这个例子一样,已经匹配好的我们就可以不管了,因为是两两匹配的,所以说回文串中心不会改变,不用担心会有什么问题

然后最容易想不通的就是长串内部的消除问题

1 | FOR(i,0,25){ |
abgfhh 和abcdeee的匹配过程(longRem ≥ shortRem 就可以像下图这样将重复元素加入到对称轴两边,进而就可以抵消)

当(longRem < shortRem),为什么答案就是shortRem那?
说白了其实就是把这些奇数的都给搞定了,剩下的就都是偶数的,就比较好搞了()

与longRem匹配完剩余是偶数的情况更简单,就不画了。
AC
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=75405249
1 | // Problem: Tokitsukaze and Concatenate Palindrome |
1 | struct cmp{ |
给multiset的cmp记得加const,否则有可能CE
1 | for(multiset<pll>::iterator it=B.begin();it!=B.end();){ |
然后erase()只能传入iterator,不能够传入reverse_iterator
https://atcoder.jp/contests/abc382/submissions/62419496
1 | // Problem: C - Kaiten Sushi |