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. 搭建 Nginx 服务

    今日内容 上一篇测试 c出现问题 web 服务 部署 Nginx 内容详细 上一篇测试 NFS共享文件步骤 - 服务端 [root@backup ~]# yum install nfs-utils r ...

  2. Hyperledger Fabric 2.x Java区块链应用

    一.说明 在上一篇文章中 <Hyperledger Fabric 2.x 自定义智能合约> 分享了智能合约的安装并使用 cli 客户端进行合约的调用:本文将使用 Java 代码基于 fab ...

  3. 【一天一个小知识10/20】Unity通过www获取json文本信息。

    前提:领导要我在unity获取局域网服务器的文本信息.给了一个json的网络文本让我测试.我对于json以及服务器比较陌生.就直接去网上找相关的资料. 以下是自己测试的代码,没问题. 测试的网络jso ...

  4. 移动BI,移动报表平台

    ​随着大数据时代的到来,随着商业智能衍生出来的移动BI也将处于一片大好的形式中,由于智能手机.移动应用的普及,越来越多的办公软件均已支持了移动办公,这也给移动BI带来了更多的想象,通过一部手机就可以随 ...

  5. 商业智能BI必备的特性,BI工具介绍

    商业智能BI的本质 对企业来说,商业智能BI不能直接产生决策,而是利用BI工具处理后的数据来支持决策.核心是通过构建数据仓库平台,有效整合数据.组织数据,为分析决策提供支持并实现其价值. 传统的DW/ ...

  6. python为什么是高级语言和解释型编程语言?它是如何粘合其它语言写的代码的?

    学习python之初,不知道大家对于python有没有疑惑,应当是有的.这里我整理出来了自己的一些疑惑,供大家参考. 为什么python是高级程序设计语言 ​ Java,C,C++这些语言是高级语言, ...

  7. Oracle之SQL的简单查询

    查询结构 --SQL语句的执行原理以及语法结构: /* SELECT * | 列名1[,列名2...] | 表达式 FROM 表名 [表的别名] WHERE 分组前的筛选条件 GROUP BY 列名1 ...

  8. Windows端口开启关闭

    转至:https://www.cnblogs.com/shenyiyangle/p/10503754.html netstat-a #显示所有活动的TCP连接以及计算机监听的TCP和UDP端口. ne ...

  9. Java课程设计---项目数据库设计(含实体类)

    1.表设计 (1)新建表tb_student(学生表) (2)新建表tb_admin(管理员表) (3)新建表tb_teacher(教师表) (4)新建表tb_course(课程表) (5)新建表tb ...

  10. TypeScript学习第二天:认识ts的数据类型

    目录 1,类型总览 2,基本类型 2.1,布尔 2.2,数字 2.3,字符串 2.4,Null 2.5,undefined 2.6,symbol 2.7,bigint 3,引用类型 3.1,数组 Ar ...