CODEFORCES 645E Intellectual Inquiry

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CODEFORCES 645E Intellectual Inquiry相关的知识,希望对你有一定的参考价值。

// CODEFORCES 645E Intellectual Inquiry

http://codeforces.com/problemset/problem/645/E

字母表只有前面 k 个小写字母。给出一个字符串 s,你可以往 s 后添加 n 个字母,使得,总的字符串的不同子序列最多。

Input

n k
s

1 ≤ n ≤ 1,000,000
1 ≤ k ≤ 26
1 ≤ |s| ≤ 1,000,000

Output

输出答案模 1,000,000,007。

Solution

看了题解才会的。

f[i] 表示以 i 为结尾的子序列(不含空串)有多少个,往字符串后面加一个字母 c,则只有 f[c] 会改变。而且是改成 ∑f[] + 1。重点在这个值跟 c 是没有关系的,改变之后的所以子序列数目的和是 ∑f[] - f[c] + ∑f[] + 1,要使这个值最大,应该使得 f[c] 最小,也就是说,添加一个使得 f[c] 最小的 c 在字符串末尾是最佳的方案。

Code

  1. /** 
  2. * Author: +7w 
  3. */ 
  4. #include <assert.h> 
  5. #include <ctype.h> 
  6. #include <inttypes.h> 
  7. #include <math.h> 
  8. #include <stdio.h> 
  9. #include <stdlib.h> 
  10. #include <string.h> 
  11. #include <time.h> 
  12.  
  13. #include <algorithm> 
  14. #include <bitset> 
  15. #include <functional> 
  16. #include <list> 
  17. #include <iostream> 
  18. #include <map> 
  19. #include <queue> 
  20. #include <set> 
  21. #include <stack> 
  22. #include <sstream> 
  23. #include <string> 
  24. #include <vector> 
  25.  
  26. const int INF3 = 0x3f3f3f3f
  27. const int INF5 = 0x5f5f5f5f
  28. const double PI = acos(-1.0); 
  29. const double EPS9 = 1e-9
  30. const int TEN3 = 1000
  31. const int TEN6 = TEN3 * TEN3; 
  32. const int TEN9 = TEN6 * TEN3; 
  33.  
  34. typedef long long llong; 
  35. typedef unsigned long long ullong; 
  36. typedef std::pair<int, int> pii; 
  37.  
  38. #define FST first 
  39. #define SEC second 
  40. #define PB push_back 
  41. #define MP make_pair 
  42. #define CLEAR(a) memset(a, 0, sizeof(a)) 
  43. #define FILL(a, c) memset(a, c, sizeof(a)) 
  44. #define COPY(a, b) memcpy(a, b, sizeof(b)) 
  45.  
  46. const int MOD = TEN9 + 7
  47. const int N = TEN6 + 10
  48. const int K = 30
  49. const int M = TEN6 + 10
  50.  
  51. char str[M]; 
  52. pii cv[N]; 
  53.  
  54. int main(int argc, char const *argv[]) 

  55. int n, k; 
  56. scanf("%d %d", &n, &k); 
  57. scanf("%s", str); 
  58. for (int i = 0; i < k; ++i) { 
  59. cv[i].FST = i; // cmper 
  60. cv[i].SEC = 0; // value 

  61. int sum = 0
  62. for (int i = 0; str[i]; ++i) { 
  63. int j = str[i] - ‘a‘
  64. int tmp_sec = cv[j].SEC; 
  65. cv[j].SEC = (sum + 1) % MOD; 
  66. sum = (sum - tmp_sec + MOD) % MOD; 
  67. sum = (sum + cv[j].SEC) % MOD; 
  68. cv[j].FST = i + k; 

  69. std::sort(cv, cv + k); 
  70. for (int i = 0; i < n; ++i) { 
  71. int j = i % k; 
  72. int tmp_sec = cv[j].SEC; 
  73. cv[j].SEC = (sum + 1) % MOD; 
  74. sum = (sum - tmp_sec + MOD) % MOD; 
  75. sum = (sum + cv[j].SEC) % MOD; 

  76. printf("%d\n", (sum + 1) % MOD); 
  77. return 0

以上是关于CODEFORCES 645E Intellectual Inquiry的主要内容,如果未能解决你的问题,请参考以下文章

intell-

如何组合多个ArrayList 将值放入一个ListView中

2010.1.1 CLR 无法从 COM 上下文

codeforces上怎么看测试数据

如何看codeforces做了多少题

codeforces上怎么看测试数据