其实看官方题解就好,我只是想记录一下自己干了什么
1001,因为每个位置一定要铲且只能铲一次,那从第一个位置开始每次铲尽量长的一段就行了(好像有人用map做超时了,离散化会靠谱些?)
1002,可以枚举去掉K位数字后最高位是原数的第几位,预处理一下后缀,判一下就行了吧
1003,期望×
26n
26
n
后是所有串的次数和,若位置
i
i
置换回自己的环长度是,那么串置换回自己的次数是
lcm(s1,s2....,sn)
l
c
m
(
s
1
,
s
2....
,
s
n
)
,长度相同的环对lcm贡献一样,所以可以看做同一个环,因为26个字母最多只会有6个长度不同的环,所以可以矩乘,不同环个数为m,就用一个
2m∗2m
2
m
∗
2
m
的矩阵,表示每种长度的环是否出现
还可以用容斥,枚举最终的串有哪些环,再枚举他们的子集容斥一下
1004,折半搜索,搜完两边各
215
2
15
次方个子集后,考虑合并,要求出子集的元素和及两两相乘的和,设左半的为
Ai,Bi
A
i
,
B
i
,右半的为
Cj,Dj
C
j
,
D
j
,若
i,j
i
,
j
能够组合在一起,
满足
Ai∗Cj+Bi+Dj>=0
A
i
∗
C
j
+
B
i
+
D
j
>=
0
,
然后移项得
Ai∗Cj+Bi>=−Dj
A
i
∗
C
j
+
B
i
>=
−
D
j
,
把
(Cj,−Dj)
(
C
j
,
−
D
j
)
视为平面上一点,对于
i
i
就是求下方的点数,用kd-tree即可