随笔分类 - spoj
摘要:题面传送门 我的群论好拉/kk 首先如果直接对着矩阵转置做显然不太能做,再加上它给出的是二的幂次,所以我们可以考虑从二进制下手。 写成二进制以后它的变化方式就明朗的多:将一个长度为 的二进制数循环位移 位。 众所周知这种交换题最小次数是 环的个数,因此我们只需要求出环的
阅读全文
摘要:题面传送门 题目中怎么不说明这个可以取空区间啊害我调半天。 这个重复的算一次就容易想到区间数颜色的相关套路,就是每个点记录前面最近的点。 离线询问然后扫描线,记录线段树上每个位置的值为到当前点的区间的和,那么需要做的就是两种操作: 将上一个这个数的出现位置+1到现在的位置都加上一个数。 查询区间历史
阅读全文
摘要:题面传送门 实际上是一种类似于分治的思想求第小子串。 首先构造好SAM。 用拓扑排序预处理出每个节点走下去会碰到多少个子串。 然后对于当前的第大子串,我们从小往大枚举,然后看看能不能走下去即可。 时间复杂度 code: #include<cstdio> #include<c
阅读全文
摘要:题面传送门 先来考虑两个字符串的最长公共子串怎么求。 考虑SAM有一个性质:源点到任意点的任意路径都是原串的一个子串。 这个性质就可以搞了。 首先对于第一个串建立AC自动机,然后让第二个串在第一个串上跑匹配。 这样就可以计算答案了。 但是对于多个串怎么办呢? 可以在每个节点上都对于每个串计算答案并取
阅读全文
摘要:题面传送门 感觉统计答案那一步很妙啊。 其实对于每个节点代表的字符串集合的出现次数很容易统计。 但是我们发现一个节点所代表的其实是一组字符串,而这个东西看上去只能线段树覆盖,时间复杂度是的。 然而spoj死慢的机子紧张的时限使得这个不怎么容易通过。 然而我们发现这个答案具有单调性
阅读全文
摘要:题面传送门 考虑前缀和后转化为区间最长相等数距离。 那么可以回滚莫队解决。 回滚莫队是什么呢?适用于一些只能增加而很难减少的情况。 将莫队左端点在一个块时,右端点升序排序,同时维护最左和最右即可。 代码实现: #include<cstdio> #include<algorithm> #include
阅读全文
摘要:题面传送门 感觉就像一道裸题。 转化成前缀和然后建边即可。 注意前缀和特性: 所以按照这个建边就好了。 代码实现: #include<cstdio> #include<cstring> #include<queue> #define
阅读全文
摘要:题面传送门 显然可以四分树。 就是在线段树上加两个维度即可。 注意边界值。 代码实现: #include<cstdio> #define max(a,b) ((a)>(b)?(a):(b)) using namespace std; int n,m,k,x,y,z,sx,sy,sz,f[160000
阅读全文