[Luogu5319][BJOI2019]奥术神杖(分数规划+AC自动机)
对最终答案取对数,得到$\ln(Ans)=\frac{1}{c}\sum \ln(v_i)$,典型的分数规划问题。
二分答案后,对所有咒语串建立AC自动机,然后套路地$f[i][j]$表示走到T的第i个字符,当前在自动机的第j个位置,能得到的最大收益。
注意二分的r初始不能设太大,25就可以了,二分终止的eps最好设到1e-5,否则会WA或者TLE。
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
using namespace std; const int N=,inf=1e9;
const double eps=1e-;
char S[N],ss[N][N],pre[N][N];
int n,m,x,nd,sz[N],fail[N],q[N],son[N][],fr[N][N];
double v[N],w[N],f[N][N]; void add(char s[],double v){
int x=,len=strlen(s+);
rep(i,,len){
int c=s[i]-'';
if (!son[x][c]) son[x][c]=++nd;
x=son[x][c];
}
w[x]+=v; sz[x]++;
} void bfs(){
int st=,ed=;
rep(i,,) if (son[][i]) q[++ed]=son[][i];
while (st!=ed){
int x=q[++st];
rep(i,,) if (son[x][i]) fail[son[x][i]]=son[fail[x]][i],q[++ed]=son[x][i];
else son[x][i]=son[fail[x]][i];
w[x]+=w[fail[x]]; sz[x]+=sz[fail[x]];
}
} double solve(double mid){
rep(i,,n) rep(j,,nd) f[i][j]=-inf;
f[][]=; double ans=-inf;
rep(i,,n-) rep(j,,nd){
if (S[i+]!='.'){
int t=son[j][S[i+]-''];
if (f[i][j]+w[t]-mid*sz[t]>f[i+][t])
f[i+][t]=f[i][j]+w[t]-mid*sz[t],fr[i+][t]=j;
continue;
}
rep(c,,){
int t=son[j][c];
if (f[i][j]+w[t]-mid*sz[t]>f[i+][t])
f[i+][t]=f[i][j]+w[t]-mid*sz[t],fr[i+][t]=j,pre[i+][t]=c+'';
}
}
rep(i,,nd) ans=max(ans,f[n][i]); return ans;
} void Print(int i,int j){
if (!i) return;
Print(i-,fr[i][j]);
if (S[i]!='.') putchar(S[i]); else putchar(pre[i][j]);
} int main(){
freopen("arcana.in","r",stdin);
freopen("arcana.out","w",stdout);
scanf("%d%d%s",&n,&m,S+);
rep(i,,m) scanf("%s%d",ss[i]+,&x),v[i]=log(x),add(ss[i],v[i]);
double L=,R=; bfs();
while (L+eps<R){
double mid=(L+R)/;
if (solve(mid)>) L=mid; else R=mid;
}
solve(L); int mn=-inf,mnd=;
rep(i,,nd) if (f[n][i]>mn) mn=f[n][i],mnd=i;
Print(n,mnd);
return ;
}
[Luogu5319][BJOI2019]奥术神杖(分数规划+AC自动机)的更多相关文章
- luoguP5319 [BJOI2019]奥术神杖(分数规划,AC自动机DP)
luoguP5319 [BJOI2019]奥术神杖(分数规划,AC自动机DP) Luogu 题解时间 难点在于式子转化,设有c个满足的子串,即求最大的 $ ans = \sqrt[c]{\prod_{ ...
- [BJOI2019] 奥术神杖 [取log+AC自动机+dp]
题面 传送门 思路 首先,看到这个乘起来开根号的形式,应该能想到用取$\log$的方式做一个转化: $\sqrt[n]{\prod_i a_i}=\frac{1}{n}\sum_i \log_b a_ ...
- [BJOI2019]奥术神杖(分数规划+AC自动机+DP)
题解:很显然可以对权值取对数,然后把几何平均值转为算术平均值,然后很显然是分数规划.先对每个模式串建立AC自动机,每个节点w[i],sz[i]分别表示以其为前缀的字符串,然后再二分最优解k,然后w[i ...
- P5319-[BJOI2019]奥术神杖【0/1分数规划,AC自动机,dp】
正题 题目链接:https://www.luogu.com.cn/problem/P5319 题目大意 一个长度为\(n\)的串\(T\),用\(0\sim 9\)填充所有的\(.\). 然后给出\( ...
- [BJOI2019]奥术神杖(分数规划,动态规划,AC自动机)
[BJOI2019]奥术神杖(分数规划,动态规划,AC自动机) 题面 洛谷 题解 首先乘法取\(log\)变加法,开\(c\)次根变成除\(c\). 于是问题等价于最大化\(\displaystyle ...
- [BJOI2019]奥术神杖——AC自动机+DP+分数规划+二分答案
题目链接: [BJOI2019]奥术神杖 答案是$ans=\sqrt[c]{\prod_{i=1}^{c}v_{i}}=(\prod_{i=1}^{c}v_{i})^{\frac{1}{c}}$. 这 ...
- [BJOI2019]奥术神杖(AC自动机,DP,分数规划)
题目大意: 给出一个长度 $n$ 的字符串 $T$,只由数字和点组成.你可以把每个点替换成一个任意的数字.再给出 $m$ 个数字串 $S_i$,第 $i$ 个权值为 $t_i$. 对于一个替换方案,这 ...
- luogu P5319 [BJOI2019]奥术神杖
传送门 要求的东西带个根号,这玩意叫几何平均数,说到平均数,我们就能想到算术平均数(就是一般意义下的平均数),而这个东西是一堆数之积开根号,所以如果每个数取对数,那么乘法会变成加法,开根号变成除法,所 ...
- #loj3089 [BJOI2019]奥术神杖
卡精度好题 最关键的一步是几何平均数的\(ln\)等于所有数字取\(ln\)后的算术平均值 那么现在就变成了一个很裸的01分数规划问题,一个通用的思路就是二分答案 现在来考虑二分答案的底层怎么写 把所 ...
随机推荐
- useReducer介绍和简单使用(六)
上节课学习了useContext函数,那这节课开始学习一下useReducer,因为他们两个很像,并且合作可以完成类似的Redux库的操作.在开发中使用useReducer可以让代码具有更好的可读性和 ...
- 对实体 "useSSL" 的引用必须以 ';' 分隔符结尾。 Nested exception: 对实体 "useSSL" 的引用必须以 ';' 分隔符结尾
今天在定义数据源的时候,在配置context.xml文件时,连接mysql数据库的url一行发生错误,报错:“对实体 "useSSL" 的引用必须以 ';' 分隔符结尾”.以下是我 ...
- SQL中join和cross join的区别
SQL中的连接可以分为内连接,外连接,以及交叉连接 . 1. 交叉连接CROSS JOIN 如果不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积: 举例, ...
- JS正则表达式使用
<script type="text/javascript"> function SubmitCk() { var reg = /^([a-zA-Z0-9]+[_|\_ ...
- Beacon Designer 8.14 下载及破解
先安装 Beacon Designer 8.14 下载地址 http://1.download.minixiazai.com/pc/Beacon.Designer.8_po.ziphttp://www ...
- Flutter和原生交互学习
PlatformChannel功能简介 PlatformChannel分为BasicMessageChannel.MethodChannel以及EventChannel三种.其各自的主要用途如下: B ...
- centos和windows添加路由命令记录
# 默认路由做香港出口route add default gw 192.168.10.33route add default gw 192.168.10.1 # 删除默认路由# route del d ...
- windows nginx重启脚本.bat
在nginx.exe目录下新建txt文件写入 @echo offtaskkill /f /fi "IMAGENAME eq nginx.exe"start nginx.exe#pa ...
- Android平台云端打包证书使用说明
原贴:https://ask.dcloud.net.cn/article/35985 Android平台云端打包证书使用说明 分类:HBuilderX 证书 Android 签名证书是一个应用的所有者 ...
- 004-行为型-11-解析器模式(Interpreter)
一.概述 提供了评估语言的语法或表达式的方式.这种模式实现了一个表达式接口,该接口解释一个特定的上下文.这种模式被用在 SQL 解析.符号处理引擎等. 意图:给定一个语言,定义它的文法表示,并定义一个 ...