P5112 FZOUTSY】的更多相关文章

卡map还行.....手写hash表即可. 我一开始以为这个k会变......在sam上想各种奇技淫巧. k不变就是问一段区间有多少对长度为k的子串相同. 然后hash把子串转化为数字,就是区间有多少对相同数字.直接莫队即可. #include <bits/stdc++.h> inline void read(int &x) { x = ; char c = getchar(); ') c = getchar(); ') { x = x * + c - ; c = getchar();…
传送门 毒瘤出题人,卡我常数 如果后缀排序后将两两之间height\(\ge k\)的后缀放在一组,那么每次询问的答案就是\(\sum_{i} \binom{num[i]}{2}\)(num[i]是第i组后缀在[l,r]之间的后缀个数),这个就是小z的袜子.不过注意块大小要开成\(\frac{n}{\sqrt{m}}\),然后求sa[i]和height[i]可以建出后缀树然后贪心遍历整棵树得到 莫队奇偶快排序比普通的慢 // luogu-judger-enable-o2 #include<bit…
传送门 没想到这题还这能用莫队--本来看看以为复杂度会挂的-- 预处理出每个字母开头往后\(k\)个的字符串的哈希值,然后大概就是那道小z的袜子了 而且据说这题的哈希得用自然溢出 //minamoto #include<bits/stdc++.h> #define R register #define ll unsigned long long #define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i) #define fd(i,a,b) for(R i…
题目 如果是\(hash\)做法的话显然就是把每一个位置后面的\(k\)个位置的hash值拿出来做一个莫队板子就好了 考虑一下牛逼的\(SAM\) 我们完全可以构造出来一棵后缀树,对于每个点找到其祖先里深度最小且\(len<=k\)的一个点,我们莫队一下就好了 最优分块大小是\(\frac{n}{\sqrt{m}}\),这样复杂度是\(O(n\sqrt{m})\) 代码 #include<cmath> #include<cstdio> #include<cstring&…