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

Luogu

题解时间

难点在于式子转化,设有c个满足的子串,即求最大的 $ ans = \sqrt[c]{\prod_{ i = 1 }^{ c } w_{i} } $ 。

取个对数变成 $ \ln Ans = \frac{1}{c} \sum_{ i = 1 } ^ { c } \ln w_{i} $ 。

很明显是0/1分数规划。

二分mid倒腾一下式子变成 $ \sum_{ i = 1 }^{ c } ( \ln w_{i} - mid ) > 0 $ 。

然后就随便做了。

#include<bits/stdc++.h>
using namespace std;
typedef long long lint;
struct pat{int x,y;pat(int x=0,int y=0):x(x),y(y){}bool operator<(const pat &p)const{return x==p.x?y<p.y:x<p.x;}};
template<typename TP>inline void read(TP &tar)
{
TP ret=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){ret=ret*10+(ch-'0');ch=getchar();}
tar=ret*f;
}
namespace RKK
{
const int N=1511;
const double eps=1e-6; int n,m;double w[N];
char str[N],rts[N]; int tcnt=0,to[N][10],fail[N],cnt[N];double v[N];
void insert(char *s,int id)
{
int len=strlen(s+1),px=0;
for(int i=1;i<=len;i++)
{
int &t=to[px][s[i]-'0'];
if(!t) t=++tcnt;px=t;
}
cnt[px]++,v[px]+=w[id];
}
queue<int> q;
void getfail()
{
for(int i=0;i<10;i++)if(to[0][i]) q.push(to[0][i]);
while(!q.empty())
{
int px=q.front();q.pop();
for(int i=0;i<10;i++)
{
int &t=to[px][i];
if(!t) t=to[fail[px]][i];
else fail[t]=to[fail[px]][i],cnt[t]+=cnt[fail[t]],v[t]+=v[fail[t]],q.push(t);
}
}
}
double dp[N][N];
int fr[N][N],g[N][N];
int work(double k)
{
for(int i=0;i<=n;i++)for(int j=0;j<=tcnt;j++) dp[i][j]=-1e18;
dp[0][0]=0;for(int i=1;i<=n;i++)for(int j=0;j<=tcnt;j++)if(dp[i-1][j]!=-1e18)
for(int b=0;b<10;b++)if(str[i]=='.'||str[i]-'0'==b)
{
int px=to[j][b];if(dp[i][px]<dp[i-1][j]+v[px]-k*cnt[px])
dp[i][px]=dp[i-1][j]+v[px]-k*cnt[px],fr[i][px]=j,g[i][px]=b;
}
double ret=-1e18;for(int i=0;i<=tcnt;i++) ret=max(ret,dp[n][i]);return ret>0;
} int prt[N];
int main()
{
scanf("%d%d%s",&n,&m,str+1);
for(int i=1;i<=m;i++)
scanf("%s%lf",rts+1,&w[i]),w[i]=log(w[i]),insert(rts,i);
getfail();
double ql=0,qr=21,qm,qa=0;
while(qr-ql>eps)
qm=(ql+qr)/2,work(qm)?qa=qm,ql=qm:qr=qm;
work(qa);
int px=0;for(int i=0;i<=tcnt;i++)if(dp[n][i]>0){px=i;break;}
for(int i=n;i;i--) prt[i]=g[i][px],px=fr[i][px];
for(int i=1;i<=n;i++) printf("%d",prt[i]);putchar('\n');
return 0;
}
}
int main(){return RKK::main();}

luoguP5319 [BJOI2019]奥术神杖(分数规划,AC自动机DP)的更多相关文章

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

    对最终答案取对数,得到$\ln(Ans)=\frac{1}{c}\sum \ln(v_i)$,典型的分数规划问题.二分答案后,对所有咒语串建立AC自动机,然后套路地$f[i][j]$表示走到T的第i个 ...

  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. POJ1625 Censored!(AC自动机+DP)

    题目问长度m不包含一些不文明单词的字符串有多少个. 依然是水水的AC自动机+DP..做完后发现居然和POJ2778是一道题,回过头来看都水水的... dp[i][j]表示长度i(在自动机转移i步)且后 ...

  8. HDU2296 Ring(AC自动机+DP)

    题目是给几个带有价值的单词.而一个字符串的价值是 各单词在它里面出现次数*单词价值 的和,问长度不超过n的最大价值的字符串是什么? 依然是入门的AC自动机+DP题..不一样的是这题要输出具体方案,加个 ...

  9. HDU2457 DNA repair(AC自动机+DP)

    题目一串DNA最少需要修改几个基因使其不包含一些致病DNA片段. 这道题应该是AC自动机+DP的入门题了,有POJ2778基础不难写出来. dp[i][j]表示原DNA前i位(在AC自动机上转移i步) ...

随机推荐

  1. Solution -「多校联训」行列式

    \(\mathcal{Description}\)   Link.   给定 \(x,\{d_i\}_{i=1}^n,\{p_i\}_{i=2}^n,\{b_i\}_{i=2}^n,\{c_i\}_{ ...

  2. Solution -「LOCAL」画画图

    \(\mathcal{Description}\)   OurTeam.   给定一棵 \(n\) 个点的树形随机的带边权树,求所有含奇数条边的路径中位数之和.树形生成方式为随机取不连通两点连边直到全 ...

  3. shell脚本批量配置多台主机静态ip

    关于脚本 服务器使用之前,都需要先配置静态IP,那就将这种简单重复的工作,交给脚本来处理吧,让我们运维有更多的时间喝茶看报刷微博 脚本使用 sh ssh.sh ip.txt ssh.sh 为脚本的名称 ...

  4. 我们一起来学Shell - 正则表达式

    文章目录 什么是正则表达式 正则表达式元字符 正则表达式应用举例 POSIX 方括号表达式 POSIX 字符集列表: 我们一起来学Shell - 初识shell 我们一起来学Shell - shell ...

  5. 100G/40G/25G/10G网络测试解决方案

    一.100G概述 随着CDN等视频直播业务和P2P业务的快速发展,带宽的要求越来越高.当前5G业务势头正盛,其基于400G的主干网络通信业务也在积极部署之中.但当前在很多的业务场景中,100G系统的部 ...

  6. 为什么在数据驱动的路上,AB 实验值得信赖?

    在线AB实验成为当今互联网公司中必不可少的数据驱动的工具,很多公司把自己的应用来做一次AB实验作为数据驱动的试金石. 文 | 松宝 来自 字节跳动数据平台团队增长平台 在线AB实验成为当今互联网公司中 ...

  7. xls/csv文件转换成dbf文件

    转至:https://blog.csdn.net/linhai1028/article/details/80211252 编写的一个小脚本,主要是利用python中的pandas,xlrd,dbfpy ...

  8. WPS:在Word中插入Visio绘制的流程图

    在Word菜单栏 插入->对象 如果Visio绘图已经保存为了文件,可以选择由文件创建

  9. Python回顾笔记(此讲大致说明,详情请看之前的笔记)

    内容概要 数据分析(numpy,pandas,matplib) 数据清洗 爬虫 teableau软件 今日内容概要 Python知识回顾 数据分析 ipython模块 anaconda软件 numpy ...

  10. pyqt(二)

    二.文本和图片 1. 文本控件 文本控件是QLabel from PyQt5.QtWidgets import QWidget,QApplication,QLabel from PyQt5.QtCor ...