【CF696D】Legen...(AC自动机)(矩阵快速幂)
题目描述
Barney was hanging out with Nora for a while and now he thinks he may have feelings for her. Barney wants to send her a cheesy text message and wants to make her as happy as possible.
Initially, happiness level of Nora is 0 0 . Nora loves some pickup lines like "I'm falling for you" and stuff. Totally, she knows n n pickup lines, each consisting only of lowercase English letters, also some of them may be equal (in writing, but different in pronouncing or meaning though). Every time Nora sees i i -th pickup line as a consecutive subsequence of Barney's text message her happiness level increases by a_{i} a
i
. These substrings may overlap, for example, Nora will see the pickup line aa twice and the pickup line ab once in text message aaab.
Due to texting app limits, Barney's text may have up to l l characters.
Barney asked you to help him make Nora as much happy as possible, it's gonna be legen...
Barney与Nora一起玩的时候,觉得自己喜欢上Nora了。他想给她发一段信息让她开心。
Nora的初始快乐值是0 。Nora喜欢“我深深地爱上你了”这样的情话。她一共知道n句情话,每句仅包含小写英文字母,其中的一些可能相同(写法相同,但读音或意思是不同的)。每次Nora在Barney的信息中看到第i句情话,她的快乐值就会增加a_ia
i
。这些情话在信息中可能重叠。例如,在aaab 中,Nora会看到aa 两次,看到ab 一次。
因为短信的长度限制,Barney的短信最长含有lll 个字符。Barney想让你帮他让Nora尽可能开心。
输入输出样例
输入 #1
3 6
3 2 1
heart
earth
art
输出 #1
6
输入 #2
3 6
3 2 8
heart
earth
art
输出 #2
16
这道题可以先把fail树建出来,应为权值是可以重叠的,所以在建fail树的同时也要更新val。
然后可以考虑DP。
\(dp[i][j]表示从fail树上点i到点j所可以带来的贡献\)
显然可以求得\(dp[i][j]\),但是N过大,所以我们考虑用矩阵快速幂加速DP。
然后求从根节点到每个节点的贡献,取最大值即可。
#include<bits/stdc++.h>
#define M 210
using namespace std;
struct data
{
long long ans[M][M];
}ans1;
int tree[M][26],cnt,val[M],sum[M*26],fail[M*26],m;
long long n,maxn;
char s[M];
queue<int> q;
void work()
{
for(int i=0;i<=cnt;i++)
{
for(int j=0;j<=25;j++)
{
ans1.ans[i][tree[i][j]]=sum[tree[i][j]];
}
}
}
data operator *(data a,data b)
{
data c;
memset(c.ans,-1,sizeof(c.ans));
for(int k=0;k<=cnt;k++)
{
for(int i=0;i<=cnt;i++)
{
if(a.ans[i][k]!=-1)
{
for(int j=0;j<=cnt;j++)
{
if(b.ans[k][j]!=-1)
{
c.ans[i][j]=max(c.ans[i][j],a.ans[i][k]+b.ans[k][j]);
}
}
}
}
}
return c;
}
void insert(int x)
{
int rt=0,len=strlen(s);
for(int i=0;i<len;i++)
{
if(!tree[rt][s[i]-'a'])
{
tree[rt][s[i]-'a']=++cnt;
}
rt=tree[rt][s[i]-'a'];
}
sum[rt]+=val[x];
}
void getfail()
{
for(int i=0;i<=25;i++)
{
if(tree[0][i])
{
q.push(tree[0][i]);
}
}
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=0;i<=25;i++)
{
int &v=tree[u][i];
if(!v)
{
v=tree[fail[u]][i];
continue;
}
fail[v]=tree[fail[u]][i];
sum[v]+=sum[fail[v]];
q.push(v);
}
}
}
data fastpow(data a,int b)
{
data sum=a;
while(b)
{
if(b&1)
{
sum=sum*a;
}
b>>=1;
a=a*a;
}
return sum;
}
signed main()
{
memset(ans1.ans,-1,sizeof(ans1.ans));
scanf("%lld%lld",&m,&n);
for(int i=1;i<=m;i++)
{
scanf("%lld",&val[i]);
}
for(int i=1;i<=m;i++)
{
scanf("%s",s);
insert(i);
}
getfail();
work();
ans1=fastpow(ans1,n-1);
for(int i=0;i<=cnt;i++)
{
maxn=max(maxn,ans1.ans[0][i]);
}
printf("%lld\n",maxn);
return 0;
}
【CF696D】Legen...(AC自动机)(矩阵快速幂)的更多相关文章
- Codeforces Round #362(Div1) D Legen...(AC自动机+矩阵快速幂)
题目大意: 给定一些开心串,每个串有一个开心值,构造一个串,每包含一次开心串就会获得一个开心值,求最大获得多少开心值. 题解: 首先先建立AC自动机.(建立fail指针的时候,对val要进行累加) 然 ...
- 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不太好 ...
随机推荐
- python openpyxl内存不主动释放 ——关闭Excel工作簿后内存依旧(MemoryError)
在openpyxl对Excel读写操作过程中,发现内存没有马上释放,如果得多次读取大文件,内存爪机,后续代码就无法运行. 尝试:各种wb.save()或者with open等途径无法解决. 发现:因为 ...
- win10下使用Linux命令
下载Cygwin安装包 官网下载地址:https://cygwin.com/install.html 执行下载好的安装程序 选择默认安装路径C:\cygwin64即可,可在C:\cygwin64\bi ...
- 快学Scala 第六课 (类getter和setter)
类getter和setter 如果字段定义是private[this], 字段是私有的,但不生成getter和setter方法. class Counter { private[this] var v ...
- day 20作业
目录 1.下面这段代码的输出结果将是什么?请解释. 2.多重继承的执行顺序,请解答以下输出结果是什么?并解释. 3.什么是新式类,什么是经典类,二者有什么区别?什么是深度优先,什么是广度优先? 4.用 ...
- Web性能优化:雅虎35条
对web性能优化,一直知道是个很重要的方面,平时有注意到,但是对于雅虎35条是第一次听说,查了一下,发现平时都有用过,只是没有总结到一块,今天就总结一下吧. 雅虎35条: 1.[内容]尽量减少HTTP ...
- BZOJ 4392 卡牌游戏
Description 奶牛贝茜是卡牌游戏的狂热爱好者, 但是令人吃惊的, 她缺乏对手. 不幸的是, 任何牧 群里的其他牛都不是好对手. 他们实在是太差了 , 实际上, 他们玩卡牌游戏时会遵循一种完全 ...
- 爬虫 xpath
xpath简介 1.xpath使用路径表达式在xml和html中进行导航 2.xpath包含标准函数库 3.xpath是一个w3c的标准 xpath节点关系 1.父节点 2.字节点 3.同胞节点 4. ...
- VMware ESXI6.0服务器安装系列:U盘安装问题汇总之网卡驱动安装
本文转载至:http://blog.51cto.com/huanwenli/1749298 在给物理服务器安装ESXI的过程中经常会遇到网卡驱动问题,如果是买的是Dell.HP.IBM等厂商的服务器, ...
- Python之selenium+pytesseract 实现识别验证码自动化登录脚本
今天写自己的爆破靶场WP时候,遇到有验证码的网站除了使用pkav的工具我们同样可以通过py强大的第三方库来实现识别验证码+后台登录爆破,这里做个笔记~~~ 0x01关于selenium seleniu ...
- Display 1 No cameras rendering
解决: 点击Main Camera ,