题目大意:

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

题解:

首先先建立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])

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

然后救过了!

#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
const int N = , maxc = ;
char str[];
struct Trie{
int Next[N][maxc], fail[N], tag[N];
long long val[N];
int root, L;
int newnode(){
for(int i = ; i < maxc; i++)
Next[L][i] = -;
tag[L++] = ;
return L-;
}
void init() { L = ; root = newnode(); }
void Insert(char* s, int len, int v){
int u = root;
for(int i = ; i < len; i++){
int c = s[i] - 'a';
if(Next[u][c] == -) Next[u][c] = newnode();
u = Next[u][c];
}
tag[u] = ;
val[u] += v;
}
void build(){
queue<int> Q;
fail[root] = root;
for(int i = ; i < maxc; i++){
if(Next[root][i] == -) Next[root][i] = root;
else {
fail[Next[root][i]] = root;
Q.push(Next[root][i]);
}
}
while(!Q.empty()){
int u = Q.front();
Q.pop();
val[u] += val[fail[u]];
for(int i = ; i < maxc; i++){
int &v = Next[u][i];
if(v == -){
v = Next[fail[u]][i];
} else {
Q.push(v);
fail[v] = Next[fail[u]][i];
}
}
}
}
}ac; struct Matrix{
long long Mat[][];
int n;
Matrix() {n = ; memset(Mat, , sizeof(Mat));}
Matrix(Matrix &B){
n = B.n;
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++)
Mat[i][j] = B.Mat[i][j];
}
Matrix operator +(const Matrix &B)const {
Matrix C;
C.n = n;
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++){
C.Mat[i][j] = -1e18;
for(int k = ; k <= n; k++)
C.Mat[i][j] = max(C.Mat[i][j], Mat[i][k] + B.Mat[k][j]);
}
return C;
}
void print(){
cout<<"*"<<endl;
for(int i = ; i <= n; i++){
for(int j = ; j <= n; j++) cout<<Mat[i][j]<<" ";
cout<<endl;
}
}
}A;
Matrix mypow(Matrix A, long long b)
{ Matrix ans = A; b--; for(; b; b >>= , A = A+A) if(b&) ans = ans+A; return ans;}
int n, val[];
long long l;
int main()
{
ac.init();
cin>>n>>l;
for(int i = ; i <= n; i++) scanf("%d", &val[i]);
for(int i = ; i <= n; i++){
cin>>str;
ac.Insert(str, strlen(str), val[i]);
}
ac.build();
A.n = ac.L-;
for(int i = ; i < ac.L; i++)
for(int j = ; j < ac.L; j++)
A.Mat[i][j] = -1e18;
for(int i = ; i < ac.L; i++){
for(int j = ; j < maxc; j++){
int v = ac.Next[i][j];
if(v == -) continue;
A.Mat[i][v] = ac.val[v];
}
}
A = mypow(A, l);
long long ans = -1e18;
for(int i = ; i < ac.L; i++) ans = max(ans, A.Mat[][i]);
cout<<ans<<endl;
return ;
}

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. log4net始终占用日志文件的问题

    在appender 下面加 <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />

  2. jenkins自动打包部署linux

    需要用到2个插件. git parameter:用于参数化构建时选择分支. Publish Over SSH:用于上传jar包和操作tomcat 1.先在系统设置添加要连接的linux服务器,使用用户 ...

  3. 在Notepad++中为Python配置编译环境

    方法1:按下F5 输入d:\Python25\python.exe "$(FULL_CURRENT_PATH)" 其中"d:\Python25\python.exe&qu ...

  4. Appium+python HTML测试报告(2)——一份报告模板(转)

    (原文:https://www.cnblogs.com/fancy0158/p/10055003.html) 适用于python3: 下载地址: 英文:https://pan.baidu.com/s/ ...

  5. 牛客网暑期ACM多校训练营(第一场):E-Removal(DP)

    链接:E-Removal 题意:给出序列 s1, s2, ..., sn ,1<=s[i]<=10.问删除m个数后,有多少种不同的序列. 题解:定义dp[i][j]代表长度为i,最末尾的数 ...

  6. 【python 3.6】使用itertools.product进行排列组合

    #python 3.6 #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'BH8ANK' import itertools colo ...

  7. ovs源码阅读--流表查询原理

    背景 在ovs交换机中,报文的处理流程可以划分为一下三个步骤:协议解析,表项查找和动作执行,其中最耗时的步骤在于表项查找,往往一个流表中有数目巨大的表项,如何根据数据报文的信息快速的查找到对应的流表项 ...

  8. 基于C#的机器学习--模糊逻辑-穿越障碍

    模糊逻辑-穿越障碍 模糊逻辑.另一个我们经常听到的术语.但它的真正含义是什么?它是否意味着不止一件事?我们马上就会知道答案. 我们将使用模糊逻辑来帮助引导一辆自动驾驶汽车绕过障碍,如果我们做得正确,我 ...

  9. python2/3 发送https请求时,告警关闭方法

    问题: 使用Python3 requests发送HTTPS请求,已经关闭认证(verify=False)情况下,控制台会输出以下错误: InsecureRequestWarning: Unverifi ...

  10. php 通过curl上传图片

    通过curl上传图片 PHP < 5.5: 使用 目前使用的php版本 7.1 测试无法使用 前面加@ 的方法上传文件 ,查找资料 使用 curl_setopt($ch,CURLOPT_SAFE ...