A Namomo Subsequence
具体题目见上述链接
题目大意
一个长度为
N
N
N 的字符串
S
S
S。
统计
S
S
S 有多少个满足以下条件的子序列
- 长度为 6, 第三个字符和第五个字符相同,第四个和第六个字符相同,且剩下的都不相同。
具体的说, 就是满足 ABCDCD
形式的子序列, 其中A
、 B
、C
、 D
均代表互不相同的字符。
题解
通过直接匹配的方法来计数,显然无法满足题目要求。因为我们需要枚举所有的 ABCD
(A
、B
、C
、 D
均代表互不相同的字符。)。字符集大小是 62 。
O
(
6
2
4
×
N
)
O(62^4 \times N)
O(624×N) 会TLE
。
我们发现 AB
只需要满足位于子序列 CDCD
之前的任意两个不同的字符即可(也不与CD
相同)。所以, 我们只要从后往前统计当前有多少满足 CDCD
的子序列,以及当前位置
i
i
i 之前的
S
1..
i
−
1
S_{1..i- 1}
S1..i−1 中有多少组两两不同的字符(并且都不与 CD
相同)。前者之需要先枚举 CD
分别代表什么字符,然后进行递推统计,后者需要先求出每种字符在
S
1..
i
−
1
S_{1..i-1}
S1..i−1 出现的次数
C
N
T
c
,
1..
i
\quad CNT_{c, 1..i}\quad
CNTc,1..i 然后通过平方和公式
(
(
C
1
+
C
2
+
C
3
+
.
.
C
N
)
2
−
(
C
1
2
+
C
2
2
+
C
3
2
+
.
.
C
N
2
)
)
2
=
Σ
C
i
∗
C
j
(
i
≠
j
)
\frac {((C_1 + C_2 + C_3+..C_N)^2 - (C_1^2 + C_2^2+C_3^2+..C_N^2)) }{2}=\Sigma C_i*C_j(i \neq j)
2((C1+C2+C3+..CN)2−(C12+C22+C32+..CN2))=ΣCi∗Cj(i=j)
即可求出不同字符的个数两两相乘的答案。
需要注意的是,这些字符不包含我们前面所枚举的CDCD
本题的数据规模很大, 对于 枚举的CDCD
匹配时,我们只访问 C
和D
出现过的位置即可。主要循环内部不能访问很大的数组,否则会造成常数太大。