Codeforces Round #362(Div1) D Legen...(AC自动机+矩阵快速幂)
题目大意:
给定一些开心串,每个串有一个开心值,构造一个串,每包含一次开心串就会获得一个开心值,求最大获得多少开心值。
题解:
首先先建立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自动机+矩阵快速幂)的更多相关文章
- POJ2778 DNA Sequence(AC自动机+矩阵快速幂)
题目给m个病毒串,问不包含病毒串的长度n的DNA片段有几个. 感觉这题好神,看了好久的题解. 所有病毒串构造一个AC自动机,这个AC自动机可以看作一张有向图,图上的每个顶点就是Trie树上的结点,每个 ...
- poj2778DNA Sequence (AC自动机+矩阵快速幂)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud DNA Sequence Time Limit: 1000MS Memory ...
- HDU 2243考研路茫茫——单词情结 (AC自动机+矩阵快速幂)
背单词,始终是复习英语的重要环节.在荒废了3年大学生涯后,Lele也终于要开始背单词了. 一天,Lele在某本单词书上看到了一个根据词根来背单词的方法.比如"ab",放在单词前一般 ...
- POJ2778(SummerTrainingDay10-B AC自动机+矩阵快速幂)
DNA Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 17160 Accepted: 6616 Des ...
- poj2778 ac自动机+矩阵快速幂
给m个子串,求长度为n的不包含子串的母串数,最直接的应该是暴搜,肯定tle,考虑用ac自动机 将子串建成字典树,通过next表来构造矩阵,然后用矩阵快速幂求长度为n的数量 邻接矩阵https://we ...
- HDU 2243 考研路茫茫――单词情结 ——(AC自动机+矩阵快速幂)
和前几天做的AC自动机类似. 思路简单但是代码200余行.. 假设solve_sub(i)表示长度为i的不含危险单词的总数. 最终答案为用总数(26^1+26^2+...+26^n)减去(solve_ ...
- POJ - 2778 ~ HDU - 2243 AC自动机+矩阵快速幂
这两题属于AC自动机的第二种套路通过矩阵快速幂求方案数. 题意:给m个病毒字符串,问长度为n的DNA片段有多少种没有包含病毒串的. 根据AC自动机的tire图,我们可以获得一个可达矩阵. 关于这题的t ...
- 考研路茫茫——单词情结 HDU - 2243 AC自动机 && 矩阵快速幂
背单词,始终是复习英语的重要环节.在荒废了3年大学生涯后,Lele也终于要开始背单词了. 一天,Lele在某本单词书上看到了一个根据词根来背单词的方法.比如"ab",放在单词前一般 ...
- POJ 2778 DNA Sequence(AC自动机 + 矩阵快速幂)题解
题意:给出m个模式串,要求你构造长度为n(n <= 2000000000)的主串,主串不包含模式串,问这样的主串有几个 思路:因为要不包含模式串,显然又是ac自动机.因为n很大,所以用dp不太好 ...
随机推荐
- 有关Laravel 4 的 Homestead 安装部署的细节
对于Vagrant,我是相见恨晚的.有时候抽出几个小时的时间学会一种工具,对于将来可以节省几十甚至几百小时的时间. Vagant最大的好处就是节省了安装配置运行环境的时间,统一开发环境,同时可以最大限 ...
- 使用Nexus搭建Maven私服问题总结
#业务场景 最近项目要交付给客户了,之前项目开发和测试一直都是使用公司内部的一套环境,项目交付后客户购置了大量服务器,也要将整套测试环境迁移至客户的服务器上,后续的需求变更以及新需求的开发都会在客户服 ...
- 发送请求工具—Advanced REST Client的安装使用
1. 0 下载得到Advanced-REST-client_v3.1.9.zip 链接:http://pan.baidu.com/s/1c0vUnJi 密码:z34d 1.1 解压Advanced-R ...
- mysql数据导到本地
需求: 把mysql查询结果导出到txt(其他格式亦可),放在本地,供下一步使用 首先网上查了下,select * from driver into outfile 'a.txt'; 前面是你的sql ...
- Spring学习(3):Spring架构(转载)
1. Spring架构图 核心容器:包括Core.Beans.Context.EL模块. ●Core模块:封装了框架依赖的最底层部分,包括资源访问.类型转换及一些常用工具类. ●Beans模块:提供了 ...
- ADO.Net之SqlConnection、 Sqlcommand的应用
ADO.Net之SqlConnection. Sqlcommand的应用 SqlConnection 的介绍与应用 1.介绍与作用 SqlConnection是ADO.NET中的连接类. 使用sqlc ...
- Throwable、Error、Exception、RuntimeException的区别与联系
Throwable类是Java语言中所有错误和异常的超类.只有作为此类(或其子类之一)的实例的对象才被Java虚拟机抛出,或者可以被Java throw语句抛出.类似地,只有这个类或其子类之一可以是c ...
- Hackerank-Array-NewYearChaos
题目背景描述 新年第一天,N 个人排队坐过山车.每个人穿有带编号的衣服 \([1, 2, 3, ...]\). 因为排队时间太久,有人发现给前面相邻的人喂一颗糖,就可以和他交换位置,而每人手里只有两颗 ...
- 译 - Cassandra 数据建模的基本规则
Basic Rules of Cassandra Data Modeling 原文地址:http://www.datastax.com/dev/blog/basic-rules-of-cassandr ...
- php中注释有关内容
//单行注释 /*多行注释*/ /** 文档注释 (注意 文档注释与前面的那个多行注释不同)文档注释可以和特定的程序元素相关联 例如 类 函数 常量 变量方法 问了将文档注释与元素相关联 只需要在元素 ...