传送门

首先 w 1 w 2 w 3 ⋯ w n n \sqrt[n]{w_1w_2w_3\cdots w_n} nw1​w2​w3​⋯wn​ ​可以利用对数转化:
l o g 2 w 1 w 2 w 3 ⋯ w n n = 1 n ∑ l o g 2 w i log_2{\sqrt[n]{w_1w_2w_3\cdots w_n}}=\frac{1}{n}\sum log_2\ w_i log2​nw1​w2​w3​⋯wn​ ​=n1​∑log2​ wi​
那么令 t i = l o g 2 w i t_i=log_2\ w_i ti​=log2​ wi​,问题就转化为了:
m a x i m i z e : ∑ t i ∑ 1 maximize:\frac{\sum{t_i}}{\sum{1}} maximize:∑1∑ti​​
也就是一个分数规划:二分 λ \lambda λ,权值转化为 t i − λ t_i-\lambda ti​−λ。由于求最大值,那么:
如果最大的和小于 0 0 0,说明 λ > a n s \lambda>ans λ>ans,则 r = m i d r=mid r=mid。(减的多了)
如果最大的和大于 0 0 0,说明 λ < a n s \lambda<ans λ<ans,则 l = m i d l=mid l=mid。(减的少了)

在 A C AC AC自动机上 D P DP DP出最大值即可。
d p [ i ] [ j ] dp[i][j] dp[i][j]表示当前填到了原串的第 i i i位,处于自动机上的第 j j j位的和的最大值。

#include<bits/stdc++.h>
#define re register
#define cs const
cs int N=2010,maxS=2010;
cs double eps=1e-5;
int n,m;char S[N],spell[maxS];double W;
namespace AC{cs int alpha=10;int Pre[N][maxS],Ch[N][maxS],tot=0;double dp[N][maxS];struct node{int son[alpha],fail,num;double val;}a[maxS];inline void insert(char *s,double v){int now=0,len=strlen(s);for(int re i=0;i<len;++i){if(!a[now].son[s[i]-'0'])a[now].son[s[i]-'0']=++tot;now=a[now].son[s[i]-'0'];}a[now].val=v,a[now].num+=1;}inline void build_fail(){std::queue<int> Q;for(int re i=0,v;i<alpha;++i)if(v=a[0].son[i]) Q.push(v),a[v].fail=0;while(!Q.empty()){int u=Q.front();Q.pop();a[u].num+=a[a[u].fail].num;a[u].val+=a[a[u].fail].val;for(int re i=0,v;i<alpha;++i){if(v=a[u].son[i]) a[v].fail=a[a[u].fail].son[i],Q.push(v);else a[u].son[i]=a[a[u].fail].son[i];}}}inline bool check(double x){memset(dp,-0x3f,sizeof dp);dp[0][0]=0;for(int re i=0;i<n;++i){for(int re j=0;j<=tot;++j)if(S[i+1]=='.')for(int re v=0,k=a[j].son[v];v<alpha;k=a[j].son[++v]){double calc=dp[i][j]+a[k].val-x*a[k].num;if(dp[i+1][k]<calc) dp[i+1][k]=calc,Pre[i+1][k]=j,Ch[i+1][k]=v;}else{int k=a[j].son[S[i+1]-'0'];double calc=dp[i][j]+a[k].val-x*a[k].num;if(dp[i+1][k]<calc) dp[i+1][k]=calc,Pre[i+1][k]=j;}}for(int i=0;i<=tot;++i) if(dp[n][i]>0) return true;return false;}inline void print(int l,int pos){if(!l) return;print(l-1,Pre[l][pos]);putchar((S[l]=='.')?(Ch[l][pos]+'0'):(S[l]));}inline void solve(){double l=0.0,r=30;while(r-l>eps){double mid=(l+r)/2;if(check(mid)) l=mid;else r=mid;}check(l);for(int i=0;i<=tot;++i)if(dp[n][i]>0){print(n,i);return;}}
}
using AC::insert;
int main(){//  freopen("4505.in","r",stdin);scanf("%d%d%s",&n,&m,S+1);while(m--) scanf("%s",spell),scanf("%lf",&W),W=log(W),insert(spell,W);AC::build_fail();return AC::solve(),0;
}

BJOI2019 奥术神杖相关推荐

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

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

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

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

  3. Loj #3089. 「BJOI2019」奥术神杖

    Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...

  4. 「BJOI2019」奥术神杖(AC自动机+DP)

    文章目录 title solution code title solution 令Magic=Vi×Vj×Vk...Magic=V_i\times V_j\times V_k...Magic=Vi​× ...

  5. 「BJOI 2019」奥术神杖

    传送门 problem 神杖上从左到右镶嵌了 n n n 颗奥术宝石,奥术宝石一共有 10 10 10 种,用数字 " 0123456789 " "0123456789& ...

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

    正题 题目链接:https://www.luogu.com.cn/problem/P5319 题目大意 一个长度为nnn的串TTT,用0∼90\sim 90∼9填充所有的.... 然后给出mmm个串和 ...

  7. 【BJOI 2019】奥术神杖

    题意 你有一个长度为 $n$ 的模板串(由 $0-9$ 这 $10$ 个数字和通配符 $.$ 组成),还有 $m$ 个匹配串(只由 $0-9$ 这 $10$ 个数字组成),每个匹配串有一个魔力值 $v ...

  8. 「BJOI2019」

    #4372. 「BJOI2019」排兵布阵 题目描述: 小 C 正在玩一款排兵布阵的游戏.在游戏中有 $n$ 座城堡,每局对战由两名玩家来争夺这些城堡.每名玩家有 $m$ 名士兵,可以向第 $i$ 座 ...

  9. LibreOJ 题解汇总

    目录 #1. A + B Problem #2. Hello, World! #3. Copycat #4. Quine #7. Input Test #100. 矩阵乘法 #101. 最大流 #10 ...

最新文章

  1. exit(0) exit(1) return() 3个的区别
  2. HihoCoder - 1558
  3. C++的常量折叠(一)
  4. c#串口程序接收数据并打印_C#程序可打印各种数据类型的大小
  5. php 图片剪切为透明,解决PHP剪切缩略图生成png,gif透明图时,黑色背景问题
  6. nemesis什么车_马力2100匹《Trion Nemesis》谜样超跑诞生中?
  7. java.lang.ClassNotFoundException: org.apache.commons.codec.DecoderException
  8. Phoenix 映射 HBase + Maven
  9. POJ 1141 Brackets Sequence
  10. 教学用计算机房活荷载,计算机机房承重标准及承重计算方法
  11. 定义类,super的使用,super的使用
  12. 如何防御sql注入?
  13. linux关闭防火墙时出现问号乱码,linux文件名乱码问题的解决方...-tcp_wrappers防火墙配置方法-su 与 su - 的比较_169IT.COM...
  14. html怎么设置文字居中对齐
  15. ElasticSearch内存优化
  16. MTK Android 之MT6577驱动笔记
  17. RTL8188 Linux驱动移植
  18. 【plan】【01】2015.07月计划
  19. 全方位解读小红书笔记数据、千瓜功能指南更新!
  20. 赛前采访里皮表示:希望队员用真心踢球。

热门文章

  1. MySQL子查询(嵌套查询)
  2. c语言自动填表chrome网页,Form Filler:自动填写表单
  3. jQuery入门案例
  4. 设计模式之 State(状态模式)通俗理解
  5. 【opencv】二维面找角点/关键点 实现
  6. Digital Image processing 数字图像处理最佳陷波滤波器设计(频域)
  7. web常见特效——floor电梯导航
  8. python简单程序
  9. 如何快速的安装cnpm
  10. vant-ui area.js文件