codeforces gym 103069:Namomo Subsequence

A Namomo Subsequence
具体题目见上述链接

题目大意

一个长度为 N N N 的字符串 S S S
统计 S S S 有多少个满足以下条件的子序列
- 长度为 6, 第三个字符和第五个字符相同,第四个和第六个字符相同,且剩下的都不相同。
具体的说, 就是满足 ABCDCD 形式的子序列, 其中ABCD 均代表互不相同的字符。

题解

通过直接匹配的方法来计数,显然无法满足题目要求。因为我们需要枚举所有的 ABCDABCD 均代表互不相同的字符。)。字符集大小是 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..i1 中有多少组两两不同的字符(并且都不与 CD 相同)。前者之需要先枚举 CD 分别代表什么字符,然后进行递推统计,后者需要先求出每种字符在 S 1.. i − 1 S_{1..i-1} S1..i1 出现的次数 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))=ΣCiCj(i=j)
即可求出不同字符的个数两两相乘的答案。
需要注意的是,这些字符不包含我们前面所枚举的CDCD
本题的数据规模很大, 对于 枚举的CDCD 匹配时,我们只访问 CD 出现过的位置即可。主要循环内部不能访问很大的数组,否则会造成常数太大。

你可能感兴趣的:(ACM,概率论,几何学,acm竞赛)