本文共 3200 字,大约阅读时间需要 10 分钟。
翻译
给你 K K K和 m m m,给出一个长度为 m m m的由 [ 1 , K ] [1,K] [1,K]组成的序列
问用 [ 1 , K ] [1,K] [1,K]组成的长度为 n n n的好序列中有多少个如上给出的序列 定义一个序列为好序列当且仅当其有一个长度为 K K K的子串,满足 [ 1 , K ] [1,K] [1,K]在其中各出现了一次
题解
gank英文题解现场
begay的题解太难懂了… 正难则反 考虑用在所有序列中的数量减去在非法序列中的情况 第一个答案就是 K n − m ( n − m + 1 ) K^{n-m}(n-m+1) Kn−m(n−m+1) 第二种答案我们分情况讨论 1:若给出的序列是个好序列,此时不存在他在非法序列中的情况,直接输出即可 对于以下两种情况,先考虑一个子问题的求法 如何求长度为 i i i,末尾存在长度为 j j j的序列满足其中的数两两不同,但 j + 1 j+1 j+1就存在相同了的序列个数 设 d p [ i ] [ j ] dp[i][j] dp[i][j]表示如上,考虑转移至 d p [ i + 1 ] [ k ] dp[i+1][k] dp[i+1][k] 若 k ≤ j k\leq j k≤j,显然贡献仅有 1 1 1 若 k = j + 1 k=j+1 k=j+1,显然我们后面能填的数有 K − j + 1 K-j+1 K−j+1个,贡献为 K − j + 1 K-j+1 K−j+1 其余贡献为 0 0 0 转移用一个前缀和优化掉即可 2:给出的序列满足数两两不同 此时求一个问题的答案,即所有非法序列中长度为 m m m的满足两两不同的序列个数和 出来之后除掉一个 k ! ( k − m ) ! \frac{k!}{(k-m)!} (k−m)!k!即可 这个问题可以用上面的 d p dp dp完成,注意记录一个 g [ i ] [ j ] g[i][j] g[i][j]表示长度为 m m m的序列数 3:剩余情况 我们求出其前缀最长有多长满足两两不同,后缀最长有多长满足两两不同 然后可以发现的是,我们前面填的东西与后面填的东西是完全不影响的 那么就枚举一下串的位置,用上面的 d p dp dp数组计数即可 具体可以看代码
#include #include #include #include #include #include #include #include #include
转载地址:http://gemu.baihongyu.com/