对最终答案取对数,得到$\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自动机)的更多相关文章

  1. luoguP5319 [BJOI2019]奥术神杖(分数规划,AC自动机DP)

    luoguP5319 [BJOI2019]奥术神杖(分数规划,AC自动机DP) Luogu 题解时间 难点在于式子转化,设有c个满足的子串,即求最大的 $ ans = \sqrt[c]{\prod_{ ...

  2. [BJOI2019] 奥术神杖 [取log+AC自动机+dp]

    题面 传送门 思路 首先,看到这个乘起来开根号的形式,应该能想到用取$\log$的方式做一个转化: $\sqrt[n]{\prod_i a_i}=\frac{1}{n}\sum_i \log_b a_ ...

  3. [BJOI2019]奥术神杖(分数规划+AC自动机+DP)

    题解:很显然可以对权值取对数,然后把几何平均值转为算术平均值,然后很显然是分数规划.先对每个模式串建立AC自动机,每个节点w[i],sz[i]分别表示以其为前缀的字符串,然后再二分最优解k,然后w[i ...

  4. P5319-[BJOI2019]奥术神杖【0/1分数规划,AC自动机,dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P5319 题目大意 一个长度为\(n\)的串\(T\),用\(0\sim 9\)填充所有的\(.\). 然后给出\( ...

  5. [BJOI2019]奥术神杖(分数规划,动态规划,AC自动机)

    [BJOI2019]奥术神杖(分数规划,动态规划,AC自动机) 题面 洛谷 题解 首先乘法取\(log\)变加法,开\(c\)次根变成除\(c\). 于是问题等价于最大化\(\displaystyle ...

  6. [BJOI2019]奥术神杖——AC自动机+DP+分数规划+二分答案

    题目链接: [BJOI2019]奥术神杖 答案是$ans=\sqrt[c]{\prod_{i=1}^{c}v_{i}}=(\prod_{i=1}^{c}v_{i})^{\frac{1}{c}}$. 这 ...

  7. [BJOI2019]奥术神杖(AC自动机,DP,分数规划)

    题目大意: 给出一个长度 $n$ 的字符串 $T$,只由数字和点组成.你可以把每个点替换成一个任意的数字.再给出 $m$ 个数字串 $S_i$,第 $i$ 个权值为 $t_i$. 对于一个替换方案,这 ...

  8. luogu P5319 [BJOI2019]奥术神杖

    传送门 要求的东西带个根号,这玩意叫几何平均数,说到平均数,我们就能想到算术平均数(就是一般意义下的平均数),而这个东西是一堆数之积开根号,所以如果每个数取对数,那么乘法会变成加法,开根号变成除法,所 ...

  9. #loj3089 [BJOI2019]奥术神杖

    卡精度好题 最关键的一步是几何平均数的\(ln\)等于所有数字取\(ln\)后的算术平均值 那么现在就变成了一个很裸的01分数规划问题,一个通用的思路就是二分答案 现在来考虑二分答案的底层怎么写 把所 ...

随机推荐

  1. Unity3D ACT动作游戏《武士2》项目源码附教程

    武士二源码亲测unity2018.3.6能运行 仅供学习附有教程 教程完整73课,网上大部分一般为65课, 教程大小27GB,mp4格式 整理不易 扫码时备注或说明中留下邮箱 付款后如未回复请至htt ...

  2. Apollo的基本使用及常见问题

    1. 创建项目 在创建项目页面中填写相关项目信息,最后点击提交即可创建项目. 注意:应用Id必须唯一并且与客户配置的app.id一致. 2. 发布 进入对应项目可通过文本(批量)或者表格模式添加配置, ...

  3. Js-事件分发与DOM事件流

    原文地址:https://www.jianshu.com/p/dc1520327022 Js事件分发与DOM事件流 对JavaScript分发事件不熟悉,网上查阅相关资料整理后,记录一下对Javasc ...

  4. nodejs设置淘宝镜像

    nodeJS的资源仓库在国内使用过程中,偶尔会遇到各种资源问题,通常设置为淘宝的镜像,网上很多说法是安装淘宝镜像,即$ npm install -g cnpm --registry=https://r ...

  5. Composer 安装 Jira API 库

    环境要求: PHP >= 5.5.9 php JsonMapper phpdotenv 安装 下载安装 Composer curl -sS https://getcomposer.org/ins ...

  6. Flutter 介绍、运行环境

    Flutter 是谷歌公司开发的一款开源.免费的移动 UI 框架,可以让我们快速的在 Android 和iOS 上构建高质量 App.它最大的特点就是跨平台.以及高性能. Flutter 基于谷歌的 ...

  7. ISO/IEC 9899:2011 条款6.8——语句和语句块

    6.8 语句和语句块 语法 1.statement: labeled-statement compound-statement         expression-statement         ...

  8. shiro解决一个账号异地登录的问题

    如下,找到session中的信息删除即可,按照这个方式试了下.基本可用 在多台服务器部署时,前提必须实现session共享. /** * 登录认证 * @param token * @return * ...

  9. gitlab 配置到jenkins

    直接把公匙配到了gitlab,然后填入jenkins https://blog.csdn.net/zhufengyan521521/article/details/81219193  配置全局凭据 h ...

  10. linux下配置face_recognition

    1.如linux下已有python2.7,但需要更新一下python 2.7至python2.x sudo add-apt-repository ppa:fkrull/deadsnakes-pytho ...