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

正题

题目链接:https://www.luogu.com.cn/problem/P5319


题目大意

一个长度为nnn的串TTT,用0∼90\sim 909填充所有的...

然后给出mmm个串和它们的价值。

一个填充方案的价值等于:若TTT中出现了ccc个给出的串,那价值等于它们的价值乘积开ccc次根。

1≤m≤1501,1≤Vi≤1091\leq m\leq 1501,1\leq V_i\leq 10^91m1501,1Vi109


解题思路

ans=∏Vicans=\sqrt[c]{\prod V_i}ans=cVi
ln⁡ans=1c∑(ln⁡Vi)\ln ans=\frac{1}{c}\sum (\ln V_i)lnans=c1(lnVi)
然后就是一个0/10/10/1分数规划问题了,因为要匹配,所以要先跑一个ACACAC自动机上dpdpdp就好了。

时间复杂度O(n2log⁡109)O(n^2\log 10^9)O(n2log109)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
const int N=1510;
const double eps=1e-6;
int n,m,cnt,ch[N][10],fail[N],num[N];
double w[N],v[N],f[N][N];
pair<int,int>pre[N][N];queue<int> q;
char T[N],S[N];
void Insert(char *s,double val){int l=strlen(s),x=0;for(int i=0;i<l;i++){int c=s[i]-'0';if(!ch[x][c])ch[x][c]=++cnt;x=ch[x][c];}v[x]+=val;num[x]++;return;
}
void Build(){for(int i=0;i<10;i++)if(ch[0][i])q.push(ch[0][i]);while(!q.empty()){int x=q.front();q.pop();v[x]+=v[fail[x]];num[x]+=num[fail[x]];for(int i=0;i<10;i++){if(!ch[x][i])ch[x][i]=ch[fail[x]][i];else{fail[ch[x][i]]=ch[fail[x]][i];q.push(ch[x][i]);}}}return;
}
int check(double mid){for(int i=0;i<=cnt;i++)w[i]=v[i]-mid*num[i];for(int i=0;i<=n;i++)for(int j=0;j<=cnt;j++)f[i][j]=-1e100;f[0][0]=0;for(int i=1;i<=n;i++){for(int j=0;j<=cnt;j++){if(f[i-1][j]<=-1e99)continue;if(T[i]=='.'){for(int k=0;k<10;k++){int y=ch[j][k];if(f[i][y]<f[i-1][j]+w[y])f[i][y]=f[i-1][j]+w[y],pre[i][y].first=j,pre[i][y].second=k;}}else{int k=T[i]-'0',y=ch[j][k];if(f[i][y]<f[i-1][j]+w[y])f[i][y]=f[i-1][j]+w[y],pre[i][y].first=j,pre[i][y].second=k;}}}int root=0;for(int j=0;j<=cnt;j++)if(f[n][j]>f[n][root])root=j;return root;
}
void print(int k,int x){if(k<1)return; print(k-1,pre[k][x].first);printf("%d",pre[k][x].second);return;
}
int main()
{scanf("%d%d",&n,&m);scanf("%s",T+1);for(int i=1;i<=m;i++){int x;scanf("%s",S);scanf("%d",&x);Insert(S,log(x));}Build();double l=0,r=21;while(r-l>eps){double mid=(l+r)/2.0;int root=check(mid);if(f[n][root]>eps)l=mid;else r=mid;}int root=check(l);print(n,root);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319478.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微软向Linux表白: 向Linux社区开放60000多项专利

10 月 10 日&#xff0c;微软在博客中宣布正式加入开放创新网络&#xff08;Open Invention Network, 简称“OIN”&#xff09;&#xff0c;向所有开源专利联盟的成员开放其专利组合。对开源&#xff0c;微软是认真的OIN 的首席执行官 Keith Bergelt 在采访中说道&#xff1a;微…

【线段树】扇形面积并(P3997)

正题 P3997 题目大意 给若干扇形&#xff0c;问你叠了至少k次的面积 解题思路 把园展开&#xff0c;然后用线段树维护每个点的出现次数 当最大次数大于k&#xff0c;用log的时间查找该点&#xff0c;然后计算结果&#xff0c;因为最多只有2*n次查找&#xff0c;所以不会TLE…

Codeforces Round #675 (Div. 2)——F主席树待补?

A - Fence 把凑得那条边当成最长的边&#xff0c;如果abcd那么将会共线&#xff0c;只要稍微abc大一点即可满足四边形。 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath…

牛客网dp专题 数位dp

文章目录数位dp例题&#xff1a;NC116652 uva11038 How many 0sNC15035 送分了QAQNC20669 诡异数字NC20665 7的意志NC17385 Beautiful NumbersCF55D NC108918 Beautiful numbers习题&#xff1a;NC17867 明七暗七NC19327 好朋友NC19945 [CQOI2016]手机号码NC20268 [SCOI2009]WI…

YbtOJ#463-序列划分【二分答案,线段树,dp】

正题 题目链接:https://www.ybtoj.com.cn/problem/463 题目大意 给出长度为nnn的序列A,BA,BA,B。要求划分成若干段满足 对于任何i<ji<ji<j&#xff0c;若iii和jjj不是同一段的&#xff0c;要求满足Bi>AjB_i>A_jBi​>Aj​每一段AiA_iAi​的最大值的和不能超…

微软技术大会预览:DevOps顾问是怎样开发自己的产品的

“没有人比我们更懂DevOps”&#xff0c;这句话不是谁都敢说的。从无人问津到整个IT行业趋之若鹜&#xff0c;DevOps火起来也不过是3年的事情&#xff0c;但是leansoftX.com的DevOps资深顾问都是在这个行业已经摸爬滚打了10年的老兵了&#xff0c;从一开始的SDLC&#xff0c;到…

【双指针】Square Pasture G(P7153)

正题 P7153 题目大意 给你平面上的若干点&#xff0c;让你画一个正方形&#xff0c;问框住的点有多少种组合 解题思路 先枚举正方形左右两边的点&#xff0c;然后用双指针计算正方形移动过程中1框住的点 然后把所有点x,y坐标取反&#xff0c;再做一次&#xff0c;这样可以把…

Neat Tree

Neat Tree 题意&#xff1a; n个数&#xff0c;每个区间的贡献为区间内最大值减最小值&#xff0c;问这个n个数的总贡献是多少&#xff1f;也就是n所能组成的所有区间的贡献值之和 题解&#xff1a; 我们可以用单调栈来做 第i个数对答案的贡献值为h[i] * 作为最大值出现的次…

PEACHPIE 0.9.11 版本发布,可以上生产了

PeachPie在官方博客&#xff08;https://www.peachpie.io/2018/10/release-0911-visual-studio.html&#xff09;发布了PeachPie的0.9.11版本 - 用于.NET和.NET Core的PHP编译器和运行时。此更新为项目管理引入了许多新功能&#xff0c;兼容性增强和改进。0.9.11是第一个非预览…

YbtOJ#573-后缀表达【二分图匹配】

正题 题目链接:https://www.ybtoj.com.cn/contest/115/problem/2 题目大意 给出一个包含字母变量和若干种同级操作符的后缀表达式。求一个等价的表达式满足该表达式的连续相同段最少。 1≤∣S∣≤25001\leq |S|\leq 25001≤∣S∣≤2500 解题思路 构建出表达树先&#xff0c;…

【DP】Sleeping Cows P(P7154)

正题 P7154 题目大意 有n头牛和n个牛棚&#xff0c;每头牛可以进入体积大于等于该牛的牛棚&#xff0c;当一个所有未进入牛棚的牛都不能再进时&#xff0c;称为极大的匹配&#xff0c;问你有多少种极大的匹配 解题思路 先把牛棚和牛放到一起&#xff0c;然后按体积排序 那么…

[ZJOI2007]棋盘制作

文章目录[ZJOI2007]棋盘制作题意&#xff1a;题解&#xff1a;单调栈代码&#xff1a;悬线法[ZJOI2007]棋盘制作 题意&#xff1a; 选取最大的01相邻的正方形和矩形&#xff0c;输出面积 题解&#xff1a; 单调栈 如图&#xff1a; 左图为题目给的样例&#xff0c;我们要找…

.net core实践系列之SSO-同域实现

前言SSO的系列还是以.Net Core作为实践例子与大家分享&#xff0c;SSO在Web方面复杂度分同域与跨域。本篇先分享同域的设计与实现&#xff0c;跨域将在下篇与大家分享。如有需要调试demo的&#xff0c;可把SSO项目部署为域名http://sso.cg.com/&#xff0c;Web1项目部署为http:…

牛客练习赛 56 E tarjan 割边

A - 小蒟和他的乐谱 签到题&#xff0c;将原序列对 7 取模之后将序列扫描一遍就可以得到答案 不过感觉题目意思还需要理解理解 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<…

YbtOJ#903-染色方案【拉格朗日插值,NTT,分治】

正题 题目链接:https://www.ybtoj.com.cn/contest/115/problem/3 题目大意 两个长度为n1n1n1的序列a,ba,ba,b aia_iai​表示涂了iii个格子的可以获得的价值。 bib_ibi​表示恰好用iii种颜色图最多nnn个格子可以获得的总价值。 给出序列bbb&#xff0c;求序列aaa n∈[1,105]n…

【并查集】封锁阳光大学(P1330)

正题 P1330 题目大意 给你一张无向图&#xff0c;问你最少选择多少个点&#xff0c;使得每一条边都有且只有一个端点被选择 解题思路 每一条边只能选一个点&#xff0c;那么考虑对这个图黑白染色 可以用扩展域并查集判二分图&#xff0c;然后两边的点选小的就好了 code #i…

【悬线法】学习总结

【悬线法】学习总结 主要用于求满足某条件的最大矩阵 定义&#xff1a; 一条竖线&#xff0c;竖线的上端点位于矩阵的上边界或是一个障碍点&#xff0c;然后对这条悬线进行左右移动&#xff0c;直到移至障碍点或者是矩阵边界&#xff0c;进行确定这条悬线所在的极大矩阵。 底…

开源硬件论坛,燃烧你的创造力

写在大会前开源融合&#xff1a;比特与原子开源硬件延伸着开源软件的理念&#xff0c;包括硬件设计文件及基于此文件的产品都使用具有开源性质的许可协议&#xff0c;自由使用分享。虽然&#xff0c;从仅开放硬件所配套软件到对硬件本身设计也进行开放的过程&#xff0c;曾经一…

牛客练习赛 55

A - 等火车 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<queue> #include<string> #include<vector> #include<cstdio> #inclu…

CF618F-Double Knapsack【结论】

正题 题目链接:https://www.luogu.com.cn/problem/CF618F 题目大意 给出大小为nnn&#xff0c;值域为[1,n][1,n][1,n]的两个可重集合A,BA,BA,B 需要你对它们各求出可重子集使得两个子集中的数字和相等 输出方案。 1≤n≤1061\leq n\le 10^61≤n≤106 解题思路 这个值域范围…