A 02表示法
简洁高精度
B 子串的子串
做法一:数颜色,考虑经典套路,记 \(pre\),然后成了三维数点问题,CDQ,跟暴力同分。
做法二:还是三维数点,但是能 \(n^2\) 的题为啥要上高级东西,暴力固定住右端点,暴力检查左端点,然后对于每个串能贡献的是 pre
到左端点的一段合法区间,然后成了区间的并,再暴力扫一遍,时间复杂度 \(\mathcal{O}(n^2)\)。
做法三:都 \(n^2\) 了为啥还要想能扩展到更一般的做法,还是暴力固定,暴力检查,不过不记 pre
了,记个 suc
,表示最后一次出现的位置的左端点,然后每个位置记一下他是 \(c_i\) 个串最后出现的 suc
,区间 \([l,r]\) 就是这一段的 \(c_i\)。
做法四:为啥总想记一些东西来扫描做,直接考虑 \([l,r]\) 的答案 \(ans_{i,j}\),对于字符串 \([l,r]\) 的上一次出现位置为 \(x\),则他会使所有左端点在 \([1,x]\),右端点在 \([j,n]\) 的区间答案减 \(1\),二维前缀和差分即可,\(ans_{x,j}--\),做完之后前缀和处理出来每个区间减少的贡献即可,但是我今天才知道二维前缀和直接 \(f_{i,j}=f_{i,j-1}+f_{i-1,j}+f_{i-1,j-1}\) 就行,所以直接这么写也行。
C 魔法咒语
前后缀要不重,自然想到 trie
树,这样他们前后缀就是不重的,建出前后缀的两棵 trie
树,然后考虑什么时候会重,发现当前缀节点的子节点有字母 \(x\) 使,他是不能和后缀 \(x\) 匹配的,因为它的下一个节点也能组合出来这个字符串,所以记一下这个直接统计就可以,但是有例外,当后缀只有一个字母时,它不会受上面的情况限制,因为不能选空前后缀,判一下这个即可,最后就是给出的只有一个字母的串也不能匹配出来,去重后加上即可。
D 表达式
如果询问是定值,直接线段树维护即可。然后发现模数给出,分解质因数后发现是套路 CRT
,然后单独维护每个互质因子用 CRT
合并就行。