题目大概说给几个字符串,每个字符串都有一个开心值,一个串如果包含一次这些字符串就加上对应的开心值,问长度n的串开心值最多可以是多少。

POJ2778。。复习下。。太弱了都快不会做了。。

这个矩阵的乘法定义是不同的,m[i][j]=max(m1[i][k]+m2[k][j]),即从i走到k能获得的最大值与从k走到j能获得的最大值之和去更新从i到j能获得的最大值。

另外。。关于矩阵内的初始值。。用-1表示从i不能到j,比如初始的时候,i不能走一步到j结点这时值就应该设置成-1;而不能用0,因为0是有意义的,它表示能走但不能获得价值。。这个搞了好久。。好累。。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<queue>
  4. #include<iostream>
  5. #include<algorithm>
  6. using namespace std;
  7.  
  8. int tn,ch[][],fail[],sum[];
  9. void insert(char *s,int a){
  10. int x=;
  11. for(int i=; s[i]; ++i){
  12. int y=s[i]-'a';
  13. if(ch[x][y]==) ch[x][y]=++tn;
  14. x=ch[x][y];
  15. }
  16. sum[x]+=a;
  17. }
  18. void getfail(){
  19. queue<int> que;
  20. for(int i=; i<; ++i){
  21. if(ch[][i]) que.push(ch[][i]);
  22. }
  23. while(!que.empty()){
  24. int x=que.front(); que.pop();
  25. for(int y=; y<; ++y){
  26. if(ch[x][y]) que.push(ch[x][y]),fail[ch[x][y]]=ch[fail[x]][y],sum[ch[x][y]]+=sum[ch[fail[x]][y]];
  27. else ch[x][y]=ch[fail[x]][y];
  28. }
  29. }
  30. }
  31.  
  32. int val[];
  33. char str[];
  34.  
  35. struct Mat{
  36. long long m[][];
  37. Mat(){
  38. memset(m,-,sizeof(m));
  39. }
  40. };
  41. Mat operator*(const Mat &m1,const Mat &m2){
  42. Mat m;
  43. for(int i=; i<=tn; ++i){
  44. for(int j=; j<=tn; ++j){
  45. for(int k=; k<=tn; ++k){
  46. if(m1.m[i][k]==- || m2.m[k][j]==-) continue;
  47. m.m[i][j]=max(m.m[i][j],m1.m[i][k]+m2.m[k][j]);
  48. }
  49. }
  50. }
  51. return m;
  52. }
  53.  
  54. int main(){
  55. int n; long long l;
  56. scanf("%d%lld",&n,&l);
  57. for(int i=; i<=n; ++i) scanf("%d",val+i);
  58. for(int i=; i<=n; ++i){
  59. scanf("%s",str);
  60. insert(str,val[i]);
  61. }
  62.  
  63. getfail();
  64.  
  65. Mat m;
  66. for(int i=; i<=tn; ++i){
  67. for(int j=; j<; ++j){
  68. m.m[i][ch[i][j]]=sum[ch[i][j]];
  69. }
  70. }
  71.  
  72. Mat res=m;
  73. --l;
  74. while(l){
  75. if(l&){
  76. res=res*m;
  77. }
  78. m=m*m;
  79. l>>=;
  80. }
  81.  
  82. long long ans=;
  83. for(int i=; i<=tn; ++i){
  84. ans=max(ans,res.m[][i]);
  85. }
  86. printf("%lld",ans);
  87. return ;
  88. }

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

  1. Codeforces Round #362(Div1) D Legen...(AC自动机+矩阵快速幂)

    题目大意: 给定一些开心串,每个串有一个开心值,构造一个串,每包含一次开心串就会获得一个开心值,求最大获得多少开心值. 题解: 首先先建立AC自动机.(建立fail指针的时候,对val要进行累加) 然 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. NYOJ题目817英文藏头诗

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtEAAAKXCAIAAADLqoEhAAAgAElEQVR4nO3dO1LrzNbG8W8S5AyE2D

  2. json数据类型

    JSON 语法规则 JSON 语法是 JavaScript 对象表示法语法的子集. 数据在名称/值对中 数据由逗号分隔 花括号保存对象 方括号保存数组 JSON 名称/值对 JSON 数据的书写格式是 ...

  3. Visual Studio 推荐插件--高量,变量高量,语法高亮

    1  WordLight for 2008 下载网址:http://visualstudiogallery.msdn.microsoft.com/ad686131-47d4-4c13-ada2-5b1 ...

  4. Linux桌面选型

    Arch Linux 官方仓库提供的桌面环境有 Cinnamon: cinnamon Enlightenment: enlightenment17 GNOME: gnome gnome-extra K ...

  5. Jquery自定义扩展方法(二)--HTML日历控件

    一.概述 研究了上节的Jquery自定义扩展方法,自己一直想做用jquery写一个小的插件,工作中也用到了用JQuery的日历插件,自己琢磨着去造个轮子--HTML5手机网页日历控件,废话不多说,先看 ...

  6. 网站性能测试工具--MS Web Application Stress Tool

    MS Web Applicaion Stress Tool 是一款网页测试的性能工具,具体的使用可以参考下面这篇博客文章 http://cuisuqiang.iteye.com/blog/193640 ...

  7. 11g 使用rman duplicate复制数据库,创建辅助实例

    一,创建所需目录 1)创建审计文件目录 PROD1@dbrac1 /dsg/oracle11$ cd $ORACLE_BASE/admin PROD1@dbrac1 /u01/app/oracle/a ...

  8. java 杂物间 (一) Mybatis

    这里放置的是一些杂物,生人勿入. Token的一般parse 过程. @Test public void shouldDemonstrateGenericTokenReplacement() { Ge ...

  9. Sizeof与Strlen的区别与联系

    转自:http://www.cnblogs.com/carekee/articles/1630789.html 一.sizeof    sizeof(...)是运算符,在头文件中typedef为uns ...

  10. 注解:【有连接表的】Hibernate单向N->N关联

    Person与Address关联:单向N->N,[有连接表的] #和单向1->N关联代码完全相同,控制关系的一端需要增加一个set类型的属性,被关联的持久化实例以集合形式存在. #N-&g ...