[BJOI2019]奥术神杖(分数规划+AC自动机+DP)
题解:很显然可以对权值取对数,然后把几何平均值转为算术平均值,然后很显然是分数规划。先对每个模式串建立AC自动机,每个节点w[i],sz[i]分别表示以其为前缀的字符串,然后再二分最优解k,然后w[i]-=k*sz[i],然后枚举T,在AC自动机上DP一遍,求最大值是否大于0即可。
#include<bits/stdc++.h>
using namespace std;
const int N=;
int n,m,tot,ch[N][],fail[N],sz[N],g[N][N],h[N][N];
double w[N],f[N][N];
char T[N],str[N],ans[N];
void insert(int v)
{
int u=,len=strlen(str+);
for(int i=;i<=len;++i)
{
if(!ch[u][str[i]-''])ch[u][str[i]-'']=++tot;
u=ch[u][str[i]-''];
}
w[u]=log(v),sz[u]+=;
}
void build()
{
queue<int>q;
for(int i=;i<;i++)if(ch[][i])q.push(ch[][i]);
while(!q.empty())
{
int u=q.front();q.pop();
w[u]+=w[fail[u]],sz[u]+=sz[fail[u]];
for(int i=;i<;i++)
if(ch[u][i])fail[ch[u][i]]=ch[fail[u]][i],q.push(ch[u][i]);
else ch[u][i]=ch[fail[u]][i];
}
}
void dp(int i,int j,int k)
{
int c=ch[j][k];
if(f[i][c]<f[i-][j]+w[c])f[i][c]=f[i-][j]+w[c],g[i][c]=j,h[i][c]=k;
}
bool check(double val)
{
for(int i=;i<=tot;i++)w[i]-=val*sz[i];
for(int i=;i<=n;i++)
for(int j=;j<=tot;j++)
f[i][j]=-1e300;
f[][]=;
for(int i=;i<=n;i++)
for(int j=;j<=tot;j++)
if(T[i]=='.')for(int k=;k<;k++)dp(i,j,k);
else dp(i,j,T[i]-'');
double ans=-1e300;
for(int i=;i<=tot;i++)ans=max(ans,f[n][i]);
for(int i=;i<=tot;i++)w[i]+=val*sz[i];
return ans>;
}
int main()
{
scanf("%d%d",&n,&m);
scanf("%s",T+);
for(int i=,x;i<=m;i++)scanf("%s%d",str+,&x),insert(x);
build();
double l=,r=,mid;
while(r-l>1e-)
{
mid=(l+r)/;
if(check(mid))l=mid;else r=mid;
}
check(l);
int pos=;
for(int i=;i<=tot;i++)if(f[n][i]>f[n][pos])pos=i;
for(int i=n;i;i--)ans[i]=h[i][pos]+,pos=g[i][pos];
for(int i=;i<=n;i++)putchar(ans[i]);
}
[BJOI2019]奥术神杖(分数规划+AC自动机+DP)的更多相关文章
- [Luogu5319][BJOI2019]奥术神杖(分数规划+AC自动机)
对最终答案取对数,得到$\ln(Ans)=\frac{1}{c}\sum \ln(v_i)$,典型的分数规划问题.二分答案后,对所有咒语串建立AC自动机,然后套路地$f[i][j]$表示走到T的第i个 ...
- [BJOI2019] 奥术神杖 [取log+AC自动机+dp]
题面 传送门 思路 首先,看到这个乘起来开根号的形式,应该能想到用取$\log$的方式做一个转化: $\sqrt[n]{\prod_i a_i}=\frac{1}{n}\sum_i \log_b a_ ...
- luoguP5319 [BJOI2019]奥术神杖(分数规划,AC自动机DP)
luoguP5319 [BJOI2019]奥术神杖(分数规划,AC自动机DP) Luogu 题解时间 难点在于式子转化,设有c个满足的子串,即求最大的 $ ans = \sqrt[c]{\prod_{ ...
- P5319-[BJOI2019]奥术神杖【0/1分数规划,AC自动机,dp】
正题 题目链接:https://www.luogu.com.cn/problem/P5319 题目大意 一个长度为\(n\)的串\(T\),用\(0\sim 9\)填充所有的\(.\). 然后给出\( ...
- [BJOI2019]奥术神杖——AC自动机+DP+分数规划+二分答案
题目链接: [BJOI2019]奥术神杖 答案是$ans=\sqrt[c]{\prod_{i=1}^{c}v_{i}}=(\prod_{i=1}^{c}v_{i})^{\frac{1}{c}}$. 这 ...
- [BJOI2019]奥术神杖(分数规划,动态规划,AC自动机)
[BJOI2019]奥术神杖(分数规划,动态规划,AC自动机) 题面 洛谷 题解 首先乘法取\(log\)变加法,开\(c\)次根变成除\(c\). 于是问题等价于最大化\(\displaystyle ...
- POJ1625 Censored!(AC自动机+DP)
题目问长度m不包含一些不文明单词的字符串有多少个. 依然是水水的AC自动机+DP..做完后发现居然和POJ2778是一道题,回过头来看都水水的... dp[i][j]表示长度i(在自动机转移i步)且后 ...
- HDU2296 Ring(AC自动机+DP)
题目是给几个带有价值的单词.而一个字符串的价值是 各单词在它里面出现次数*单词价值 的和,问长度不超过n的最大价值的字符串是什么? 依然是入门的AC自动机+DP题..不一样的是这题要输出具体方案,加个 ...
- HDU2457 DNA repair(AC自动机+DP)
题目一串DNA最少需要修改几个基因使其不包含一些致病DNA片段. 这道题应该是AC自动机+DP的入门题了,有POJ2778基础不难写出来. dp[i][j]表示原DNA前i位(在AC自动机上转移i步) ...
随机推荐
- 解释器模式 Interpreter 行为型 设计模式(十九)
解释器模式(Interpreter) 考虑上图中计算器的例子 设计可以用于计算加减运算(简单起见,省略乘除),你会怎么做? 你可能会定义一个工具类,工具类中有N多静态方法 比如定义了两个 ...
- 二、Snapman多人协作电子表格之——软件下载安装与配置
Snapman多人协作电子表格是一个即时工作系统. 一.软件下载地址 Snapman下载的官网地址:http://www.snapman.xyz 在官网下载Snapman主程序安装: snapman_ ...
- C# 利用位运算传递多个参数方法
前言 在工作中用sendMessage的方法向另外一个进程中传递窗体的位置,长度,宽度四个值,但是sendMessage的方法签名中只有两个参数.于是在网上找到了一些代码,找到了这个利用位运算来合并参 ...
- Eclipse导出包含第三方Jar的工程
基于第三方开源的Jar包封装了一个工具类,在导出成Jar包后,引用新生成的Jar包,却报找不到类的错误.看了一下生成的Jar包,发现根本没有包含第三方Jar包的相关class.这是导出第三方Jar包时 ...
- 深入理解group by 语句的执行顺序 from→where→group by→select(含聚合函数)
由于之前没有对group by 语句的执行顺序(执行原理)做深入的了解,所以导致在实际应用过程中出现了一些问题.举个简单的粟子,比如一个表testA中的所有数据如下图: 我现在想从testA中查询us ...
- 心路历程:当win10遇上win7激活程序...请默哀
经历一次莫名其妙的懵逼系统崩溃后,我对破解软件/激活软件终于有了阴影,想想就想哭,不过怨不了别人,锅不能随便甩,怪自己粗心大意,怪自己太懒呜呜呜... 所以有心将这次心路历程记录下来,谨防自己下次再犯 ...
- MyDAL - .UpdateAsync() 使用
索引: 目录索引 一.API 列表 1.UpdateAsync() 用于 单表 更新操作 二.API 单表-便捷 方法 举例-01 var pk1 = Guid.Parse("8f2cbb6 ...
- Postgresql数据库部署之:Postgresql 存在session 会话不能删除数据库
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname='数据库名' AND pid<>pg_backen ...
- logback日志框架的简单使用
1.首先在maven中增加依赖 <dependency> <groupId>ch.qos.logback</groupId> <artifactId>l ...
- H5播放器内置播放视频(兼容绝大多数安卓和ios)
关于H5播放器内置播放视频,这个问题一直困扰我很长一段时间,qq以前提供白名单已经关闭,后来提供了同层属性的控制,或多或少也有点差强人意. 后来一次偶然发现一个非常简单的方法可以实现. 只需要给vid ...