题目大意:

给定一些开心串,每个串有一个开心值,构造一个串,每包含一次开心串就会获得一个开心值,求最大获得多少开心值。

题解:

首先先建立AC自动机。(建立fail指针的时候,对val要进行累加)

然后在AC自动机上跑dp

dp[i][j] = max(dp[i][j], dp[i-1][k] + v[j])

写成矩阵形式就是(Mat[i][j]表示从i到j最大获得的开心值)

C[i][j] = max(C[i][j], A[i][k]+B[k][j])

然后这个形式也可以用快速幂的形式加速!!

然后救过了!

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <queue>
  4. #include <cstring>
  5. using namespace std;
  6. const int N = , maxc = ;
  7. char str[];
  8. struct Trie{
  9. int Next[N][maxc], fail[N], tag[N];
  10. long long val[N];
  11. int root, L;
  12. int newnode(){
  13. for(int i = ; i < maxc; i++)
  14. Next[L][i] = -;
  15. tag[L++] = ;
  16. return L-;
  17. }
  18. void init() { L = ; root = newnode(); }
  19. void Insert(char* s, int len, int v){
  20. int u = root;
  21. for(int i = ; i < len; i++){
  22. int c = s[i] - 'a';
  23. if(Next[u][c] == -) Next[u][c] = newnode();
  24. u = Next[u][c];
  25. }
  26. tag[u] = ;
  27. val[u] += v;
  28. }
  29. void build(){
  30. queue<int> Q;
  31. fail[root] = root;
  32. for(int i = ; i < maxc; i++){
  33. if(Next[root][i] == -) Next[root][i] = root;
  34. else {
  35. fail[Next[root][i]] = root;
  36. Q.push(Next[root][i]);
  37. }
  38. }
  39. while(!Q.empty()){
  40. int u = Q.front();
  41. Q.pop();
  42. val[u] += val[fail[u]];
  43. for(int i = ; i < maxc; i++){
  44. int &v = Next[u][i];
  45. if(v == -){
  46. v = Next[fail[u]][i];
  47. } else {
  48. Q.push(v);
  49. fail[v] = Next[fail[u]][i];
  50. }
  51. }
  52. }
  53. }
  54. }ac;
  55.  
  56. struct Matrix{
  57. long long Mat[][];
  58. int n;
  59. Matrix() {n = ; memset(Mat, , sizeof(Mat));}
  60. Matrix(Matrix &B){
  61. n = B.n;
  62. for(int i = ; i <= n; i++)
  63. for(int j = ; j <= n; j++)
  64. Mat[i][j] = B.Mat[i][j];
  65. }
  66. Matrix operator +(const Matrix &B)const {
  67. Matrix C;
  68. C.n = n;
  69. for(int i = ; i <= n; i++)
  70. for(int j = ; j <= n; j++){
  71. C.Mat[i][j] = -1e18;
  72. for(int k = ; k <= n; k++)
  73. C.Mat[i][j] = max(C.Mat[i][j], Mat[i][k] + B.Mat[k][j]);
  74. }
  75. return C;
  76. }
  77. void print(){
  78. cout<<"*"<<endl;
  79. for(int i = ; i <= n; i++){
  80. for(int j = ; j <= n; j++) cout<<Mat[i][j]<<" ";
  81. cout<<endl;
  82. }
  83. }
  84. }A;
  85. Matrix mypow(Matrix A, long long b)
  86. { Matrix ans = A; b--; for(; b; b >>= , A = A+A) if(b&) ans = ans+A; return ans;}
  87. int n, val[];
  88. long long l;
  89. int main()
  90. {
  91. ac.init();
  92. cin>>n>>l;
  93. for(int i = ; i <= n; i++) scanf("%d", &val[i]);
  94. for(int i = ; i <= n; i++){
  95. cin>>str;
  96. ac.Insert(str, strlen(str), val[i]);
  97. }
  98. ac.build();
  99. A.n = ac.L-;
  100. for(int i = ; i < ac.L; i++)
  101. for(int j = ; j < ac.L; j++)
  102. A.Mat[i][j] = -1e18;
  103. for(int i = ; i < ac.L; i++){
  104. for(int j = ; j < maxc; j++){
  105. int v = ac.Next[i][j];
  106. if(v == -) continue;
  107. A.Mat[i][v] = ac.val[v];
  108. }
  109. }
  110. A = mypow(A, l);
  111. long long ans = -1e18;
  112. for(int i = ; i < ac.L; i++) ans = max(ans, A.Mat[][i]);
  113. cout<<ans<<endl;
  114. return ;
  115. }

Codeforces Round #362(Div1) D Legen...(AC自动机+矩阵快速幂)的更多相关文章

  1. POJ2778 DNA Sequence(AC自动机+矩阵快速幂)

    题目给m个病毒串,问不包含病毒串的长度n的DNA片段有几个. 感觉这题好神,看了好久的题解. 所有病毒串构造一个AC自动机,这个AC自动机可以看作一张有向图,图上的每个顶点就是Trie树上的结点,每个 ...

  2. poj2778DNA Sequence (AC自动机+矩阵快速幂)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud DNA Sequence Time Limit: 1000MS   Memory ...

  3. HDU 2243考研路茫茫——单词情结 (AC自动机+矩阵快速幂)

    背单词,始终是复习英语的重要环节.在荒废了3年大学生涯后,Lele也终于要开始背单词了. 一天,Lele在某本单词书上看到了一个根据词根来背单词的方法.比如"ab",放在单词前一般 ...

  4. POJ2778(SummerTrainingDay10-B AC自动机+矩阵快速幂)

    DNA Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17160   Accepted: 6616 Des ...

  5. poj2778 ac自动机+矩阵快速幂

    给m个子串,求长度为n的不包含子串的母串数,最直接的应该是暴搜,肯定tle,考虑用ac自动机 将子串建成字典树,通过next表来构造矩阵,然后用矩阵快速幂求长度为n的数量 邻接矩阵https://we ...

  6. HDU 2243 考研路茫茫――单词情结 ——(AC自动机+矩阵快速幂)

    和前几天做的AC自动机类似. 思路简单但是代码200余行.. 假设solve_sub(i)表示长度为i的不含危险单词的总数. 最终答案为用总数(26^1+26^2+...+26^n)减去(solve_ ...

  7. POJ - 2778 ~ HDU - 2243 AC自动机+矩阵快速幂

    这两题属于AC自动机的第二种套路通过矩阵快速幂求方案数. 题意:给m个病毒字符串,问长度为n的DNA片段有多少种没有包含病毒串的. 根据AC自动机的tire图,我们可以获得一个可达矩阵. 关于这题的t ...

  8. 考研路茫茫——单词情结 HDU - 2243 AC自动机 && 矩阵快速幂

    背单词,始终是复习英语的重要环节.在荒废了3年大学生涯后,Lele也终于要开始背单词了. 一天,Lele在某本单词书上看到了一个根据词根来背单词的方法.比如"ab",放在单词前一般 ...

  9. POJ 2778 DNA Sequence(AC自动机 + 矩阵快速幂)题解

    题意:给出m个模式串,要求你构造长度为n(n <= 2000000000)的主串,主串不包含模式串,问这样的主串有几个 思路:因为要不包含模式串,显然又是ac自动机.因为n很大,所以用dp不太好 ...

随机推荐

  1. 有关Laravel 4 的 Homestead 安装部署的细节

    对于Vagrant,我是相见恨晚的.有时候抽出几个小时的时间学会一种工具,对于将来可以节省几十甚至几百小时的时间. Vagant最大的好处就是节省了安装配置运行环境的时间,统一开发环境,同时可以最大限 ...

  2. 使用Nexus搭建Maven私服问题总结

    #业务场景 最近项目要交付给客户了,之前项目开发和测试一直都是使用公司内部的一套环境,项目交付后客户购置了大量服务器,也要将整套测试环境迁移至客户的服务器上,后续的需求变更以及新需求的开发都会在客户服 ...

  3. 发送请求工具—Advanced REST Client的安装使用

    1. 0 下载得到Advanced-REST-client_v3.1.9.zip 链接:http://pan.baidu.com/s/1c0vUnJi 密码:z34d 1.1 解压Advanced-R ...

  4. mysql数据导到本地

    需求: 把mysql查询结果导出到txt(其他格式亦可),放在本地,供下一步使用 首先网上查了下,select * from driver into outfile 'a.txt'; 前面是你的sql ...

  5. Spring学习(3):Spring架构(转载)

    1. Spring架构图 核心容器:包括Core.Beans.Context.EL模块. ●Core模块:封装了框架依赖的最底层部分,包括资源访问.类型转换及一些常用工具类. ●Beans模块:提供了 ...

  6. ADO.Net之SqlConnection、 Sqlcommand的应用

    ADO.Net之SqlConnection. Sqlcommand的应用 SqlConnection 的介绍与应用 1.介绍与作用 SqlConnection是ADO.NET中的连接类. 使用sqlc ...

  7. Throwable、Error、Exception、RuntimeException的区别与联系

    Throwable类是Java语言中所有错误和异常的超类.只有作为此类(或其子类之一)的实例的对象才被Java虚拟机抛出,或者可以被Java throw语句抛出.类似地,只有这个类或其子类之一可以是c ...

  8. Hackerank-Array-NewYearChaos

    题目背景描述 新年第一天,N 个人排队坐过山车.每个人穿有带编号的衣服 \([1, 2, 3, ...]\). 因为排队时间太久,有人发现给前面相邻的人喂一颗糖,就可以和他交换位置,而每人手里只有两颗 ...

  9. 译 - Cassandra 数据建模的基本规则

    Basic Rules of Cassandra Data Modeling 原文地址:http://www.datastax.com/dev/blog/basic-rules-of-cassandr ...

  10. php中注释有关内容

    //单行注释 /*多行注释*/ /** 文档注释 (注意 文档注释与前面的那个多行注释不同)文档注释可以和特定的程序元素相关联 例如 类 函数 常量 变量方法 问了将文档注释与元素相关联 只需要在元素 ...