题解:很显然可以对权值取对数,然后把几何平均值转为算术平均值,然后很显然是分数规划。先对每个模式串建立AC自动机,每个节点w[i],sz[i]分别表示以其为前缀的字符串,然后再二分最优解k,然后w[i]-=k*sz[i],然后枚举T,在AC自动机上DP一遍,求最大值是否大于0即可。
#include<bits/stdc++.h>
using namespace std;
const int N=;
int n,m,tot,ch[N][],fail[N],sz[N],g[N][N],h[N][N];
double w[N],f[N][N];
char T[N],str[N],ans[N];
void insert(int v)
{
int u=,len=strlen(str+);
for(int i=;i<=len;++i)
{
if(!ch[u][str[i]-''])ch[u][str[i]-'']=++tot;
u=ch[u][str[i]-''];
}
w[u]=log(v),sz[u]+=;
}
void build()
{
queue<int>q;
for(int i=;i<;i++)if(ch[][i])q.push(ch[][i]);
while(!q.empty())
{
int u=q.front();q.pop();
w[u]+=w[fail[u]],sz[u]+=sz[fail[u]];
for(int i=;i<;i++)
if(ch[u][i])fail[ch[u][i]]=ch[fail[u]][i],q.push(ch[u][i]);
else ch[u][i]=ch[fail[u]][i];
}
}
void dp(int i,int j,int k)
{
int c=ch[j][k];
if(f[i][c]<f[i-][j]+w[c])f[i][c]=f[i-][j]+w[c],g[i][c]=j,h[i][c]=k;
}
bool check(double val)
{
for(int i=;i<=tot;i++)w[i]-=val*sz[i];
for(int i=;i<=n;i++)
for(int j=;j<=tot;j++)
f[i][j]=-1e300;
f[][]=;
for(int i=;i<=n;i++)
for(int j=;j<=tot;j++)
if(T[i]=='.')for(int k=;k<;k++)dp(i,j,k);
else dp(i,j,T[i]-'');
double ans=-1e300;
for(int i=;i<=tot;i++)ans=max(ans,f[n][i]);
for(int i=;i<=tot;i++)w[i]+=val*sz[i];
return ans>;
}
int main()
{
scanf("%d%d",&n,&m);
scanf("%s",T+);
for(int i=,x;i<=m;i++)scanf("%s%d",str+,&x),insert(x);
build();
double l=,r=,mid;
while(r-l>1e-)
{
mid=(l+r)/;
if(check(mid))l=mid;else r=mid;
}
check(l);
int pos=;
for(int i=;i<=tot;i++)if(f[n][i]>f[n][pos])pos=i;
for(int i=n;i;i--)ans[i]=h[i][pos]+,pos=g[i][pos];
for(int i=;i<=n;i++)putchar(ans[i]);
}
[BJOI2019]奥术神杖(分数规划+AC自动机+DP)的更多相关文章
-
[Luogu5319][BJOI2019]奥术神杖(分数规划+AC自动机)
对最终答案取对数,得到$\ln(Ans)=\frac{1}{c}\sum \ln(v_i)$,典型的分数规划问题.二分答案后,对所有咒语串建立AC自动机,然后套路地$f[i][j]$表示走到T的第i个 ...
-
[BJOI2019] 奥术神杖 [取log+AC自动机+dp]
题面 传送门 思路 首先,看到这个乘起来开根号的形式,应该能想到用取$\log$的方式做一个转化: $\sqrt[n]{\prod_i a_i}=\frac{1}{n}\sum_i \log_b a_ ...
-
P5319-[BJOI2019]奥术神杖【0/1分数规划,AC自动机,dp】
正题 题目链接:https://www.luogu.com.cn/problem/P5319 题目大意 一个长度为\(n\)的串\(T\),用\(0\sim 9\)填充所有的\(.\). 然后给出\( ...
-
[BJOI2019]奥术神杖——AC自动机+DP+分数规划+二分答案
题目链接: [BJOI2019]奥术神杖 答案是$ans=\sqrt[c]{\prod_{i=1}^{c}v_{i}}=(\prod_{i=1}^{c}v_{i})^{\frac{1}{c}}$. 这 ...
-
[BJOI2019]奥术神杖(分数规划,动态规划,AC自动机)
[BJOI2019]奥术神杖(分数规划,动态规划,AC自动机) 题面 洛谷 题解 首先乘法取\(log\)变加法,开\(c\)次根变成除\(c\). 于是问题等价于最大化\(\displaystyle ...
-
POJ1625 Censored!(AC自动机+DP)
题目问长度m不包含一些不文明单词的字符串有多少个. 依然是水水的AC自动机+DP..做完后发现居然和POJ2778是一道题,回过头来看都水水的... dp[i][j]表示长度i(在自动机转移i步)且后 ...
-
HDU2296 Ring(AC自动机+DP)
题目是给几个带有价值的单词.而一个字符串的价值是 各单词在它里面出现次数*单词价值 的和,问长度不超过n的最大价值的字符串是什么? 依然是入门的AC自动机+DP题..不一样的是这题要输出具体方案,加个 ...
-
HDU2457 DNA repair(AC自动机+DP)
题目一串DNA最少需要修改几个基因使其不包含一些致病DNA片段. 这道题应该是AC自动机+DP的入门题了,有POJ2778基础不难写出来. dp[i][j]表示原DNA前i位(在AC自动机上转移i步) ...
-
hdu 4117 GRE Words AC自动机DP
题目:给出n个串,问最多能够选出多少个串,使得前面串是后面串的子串(按照输入顺序) 分析: 其实这题是这题SPOJ 7758. Growing Strings AC自动机DP的进阶版本,主题思想差不多 ...
随机推荐
-
如何使用新浪微博账户进行应用登录验证(基于Windows Azure Mobile Service 集成登录验证)
使用三方账号登录应用应该对大家来说已经不是什么新鲜事儿了,但是今天为什么还要在这里跟大家聊这个话题呢,原因很简单 Windows Azure Mobiles Service Authenticatio ...
-
Json概述以及python对json的相关操作《转》
什么是json: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programm ...
-
PHP - 操作MySQL数据库
第16章 PHP操作MySQL 学习要点: 1.PHP连接到MySQL 2.增删改查 3.其他常用函数 如果你已经具有了使用PHP.SQL和MySQL的丰富经验,现在就可以把所有这些技术组合在一起.P ...
-
Android系统--输入系统(十五)实战_使用GlobalKey一键启动程序
Android系统--输入系统(十五)实战_使用GlobalKey一键启动程序 1. 一键启动的过程 1.1 对于global key, 系统会根据global_keys.xml发送消息给某个组件 & ...
-
core1.1 升级到 2.0
1.直接修改项目 1.1 改成 2.0 Startup 的修改 去除构造函数中下面的代码 var builder = new ConfigurationBuilder() .SetBasePath(e ...
-
mysql学习之路_高级数据操作
关系 将实体与实体的关系,反应到最终数据表的设计上来,将关系分为三种,一对多,多对多,多对多. 所有关系都是表与表之间的关系. 一对一: 一张表的一条记录一定只对应另外一张表的一条记录,反之亦然. 例 ...
-
librtmp编译for android and ios 不要openssl
git clone git://git.ffmpeg.org/rtmpdump 不想要openssl 在rtmp.h里面 #undef CRYPTO 编译动态库与静态库只需要修改下面的 #includ ...
-
【Html 学习笔记】第七节——表单
文本框:<form> <input> </form> 密码域-文本框:<input type ="password" > 复选框:& ...
-
python学习之sys模块
查看python的版本 >>> sys.version_info[] sys.argv 列表对象,传入模块参数的都会放入列表中. #-*- coding: utf-8 -*- # i ...
-
棋盘V(最小费用最大流)
棋盘V 时间限制: 1 Sec 内存限制: 128 MB提交: 380 解决: 44[提交] [状态] [讨论版] [命题人:admin] 题目描述 有一块棋盘,棋盘的边长为100000,行和列的 ...