对最终答案取对数,得到$\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. Apache log4j 1.2 - Short introduction to log4j

    Apache log4j 1.2 - Short introduction to log4jhttps://logging.apache.org/log4j/1.2/manual.html log4j ...

  2. Ionic4.x ion-infinite-scroll 上拉分页加载更多

    <ion-header> <ion-toolbar> <ion-title> Tab One </ion-title> </ion-toolbar ...

  3. 免费好用的SSH手机客户端

    简单说一些,SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定,SSH 为建立在应用层基础上的安全协议.SSH 是目前较可靠,专 ...

  4. 从0开始学爬虫12之使用requests库基本认证

    从0开始学爬虫12之使用requests库基本认证 此处我们使用github的token进行简单测试验证 # coding=utf-8 import requests BASE_URL = " ...

  5. 【Mybatis】MyBatis之缓存(七)

    MyBatis缓存介绍 Mybatis 使用到了两种缓存:一级缓存(本地缓存.local cache)和二级缓存(second level cache). 一级缓存:基于PerpetualCache ...

  6. C++数据存储方式

    1.栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区,里面的变量通常是局部变量.函数参数等. 2.堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去 ...

  7. 青葱的岁月 Mybatis JdbcType与Oracle、MySql数据类型对应列表

    Mybatis JdbcType Oracle MySql JdbcType ARRAY     JdbcType BIGINT   BIGINT JdbcType BINARY     JdbcTy ...

  8. 增强篇3 SAP表字段增强

    有两种方式:  Include  和 Append 1.INCLUDE一般都是标准预留的增强: 以CO01生产订单增强字段为例 在表AUFK中INCLUDE的结构“CI_AUFK”加入自定义字段 保存 ...

  9. Flink 实现指定时长或消息条数的触发器

    Flink 中窗口是很重要的一个功能,而窗口又经常配合触发器一起使用. Flink 自带的触发器大概有: CountTrigger: 指定条数触发 ContinuousEventTimeTrigger ...

  10. nodejs应用转换png,jpg,gif为webp图片格式

    本博客列表缩略图在支持webp格式的浏览器下,使用的是webp格式图片,不支持webp图片下使用的是原图片(如png,gif,jpg等) webp使用指南,请参考 https://www.imqian ...