题意:给你若干个串和一个填了一部分的串。补完这个串使得 (每个串的匹配次数 * 权值) ^ (1 / 所有串匹配次数) 最大。

解:把这个东西随便取一个对数,就变成了分数规划。

二分。然后在AC自动机上DP判定。

 #include <bits/stdc++.h>

 const int N = ;
const double INF = 1e10, eps = 1e-; int tr[N][], tot(), cnt[N], g[N][N], gt[N][N], tans, fail[N], n;
double ed[N], f[N][N];
char str[N], ss[N]; inline void getfail() { std::queue<int> Q;
Q.push();
fail[] = ;
while(Q.size()) {
int x = Q.front();
if(x != ) {
ed[x] += ed[fail[x]];
cnt[x] += cnt[fail[x]];
}
Q.pop();
for(int f = ; f < ; f++) {
if(tr[x][f]) {
int y = tr[x][f];
if(x == ) fail[y] = ;
else fail[y] = tr[fail[x]][f];
Q.push(y);
}
else {
if(x == ) tr[x][f] = ;
else tr[x][f] = tr[fail[x]][f];
}
}
}
return;
} inline void insert(double v) {
int len = strlen(ss), p = ;
for(int i = ; i < len; i++) {
int f = ss[i] - '';
if(!tr[p][f]) {
tr[p][f] = ++tot;
}
p = tr[p][f];
}
ed[p] += v;
cnt[p]++;
return;
} inline double check(double D) { /// f[i][j] means len i in node j , max value for(int i = ; i <= n; i++) {
for(int j = ; j <= tot; j++) {
f[i][j] = -INF;
}
} double ans = -INF;
f[][] = ;
for(int i = ; i < n; i++) {
for(int j = ; j <= tot; j++) {
//if(sgn(f[i][j] + INF) == 0) continue;
if(f[i][j] == -INF) continue;
//printf("%lf ", f[i][j]);
if(str[i + ] != '.') {
int ff = str[i + ] - '';
int y = tr[j][ff];
if(f[i + ][y] < f[i][j] + ed[y] - D * cnt[y]) {
f[i + ][y] = f[i][j] + ed[y] - D * cnt[y];
g[i + ][y] = j;
gt[i + ][y] = ff;
}
}
else {
for(int ff = ; ff < ; ff++) {
int y = tr[j][ff];
//f[i + 1][y] = std::max(f[i + 1][y], f[i][j] + ed[y] - D * cnt[y]);
if(f[i + ][y] < f[i][j] + ed[y] - D * cnt[y]) {
//printf("ff = %d y = %d \n", ff, y);
f[i + ][y] = f[i][j] + ed[y] - D * cnt[y];
g[i + ][y] = j;
gt[i + ][y] = ff;
}
}
}
}
//puts("");
} for(int j = ; j <= tot; j++) {
if(ans < f[n][j] + eps) {
ans = f[n][j];
tans = j;
}
} return ans;
} int main() { //freopen("my.out", "w", stdout); int m;
double l = , r = ;
scanf("%d%d", &n, &m);
scanf("%s", str + );
double x;
for(int i = ; i <= m; i++) {
scanf("%s%lf", ss, &x);
//printf("i = %d \n", i);
x = log(x);
//printf(" h 21 1 1 \n");
insert(x);
//printf(" fdsgfdsfsdfsh 21 1 1 \n");
r += x;
int len = strlen(ss);
memset(ss, , len * sizeof(char));
}
//printf("gfsiofdsfsdgfs\n"); getfail(); for(int T = ; T <= ; T++) {
double mid = (l + r) / ;
//printf("mid %.10f \n", mid);
double t = check(mid);
//printf("l = %lf r = %lf mid = %lf \n", l, r, mid); if(t > ) {
l = mid;
}
else {
r = mid;
}
} //printf("r = %.10f \n", r);
/// output ways
/*
6 5
2....2
252 62
5225 18
25 7
552 12
2122 18 */ check(l);
for(int i = n; i >= ; i--) {
//printf("ans : %d \n", gt[i][tans]);
//printf("node : j = %d \n", tans);
str[i] = gt[i][tans];
tans = g[i][tans]; } for(int i = ; i <= n; i++) {
putchar(str[i] + '');
}
/*for(int i = 1; i <= n; i++) {
printf("%d \n", str[i]);
}*/ /*puts("");
for(int i = 1; i <= tot; i++) {
printf("i = %d fail = %d | ", i, fail[i]);
for(int j = 0; j < 10; j++) {
printf("%d ", tr[i][j]);
}
puts("");
}*/ return ;
}

AC代码

输出答案前如果不加那一句check(l),会WA第二个点。

洛谷P5319 奥术神杖的更多相关文章

  1. LOJ 3089: 洛谷 P5319: 「BJOI2019」奥术神杖

    题目传送门:LOJ #3089. 题意简述: 有一个长度为 \(n\) 的母串,其中某些位置已固定,另一些位置可以任意填. 同时给定 \(m\) 个小串,第 \(i\) 个为 \(S_i\),所有位置 ...

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

    [BJOI2019]奥术神杖(分数规划,动态规划,AC自动机) 题面 洛谷 题解 首先乘法取\(log\)变加法,开\(c\)次根变成除\(c\). 于是问题等价于最大化\(\displaystyle ...

  3. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  4. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  5. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  6. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

  7. 洛谷P1710 地铁涨价

    P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交  讨论  题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...

  8. 洛谷P1371 NOI元丹

    P1371 NOI元丹 71通过 394提交 题目提供者洛谷OnlineJudge 标签云端评测 难度普及/提高- 提交  讨论  题解 最新讨论 我觉得不需要讨论O long long 不够 没有取 ...

  9. 洛谷P1538迎春舞会之数字舞蹈

    题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出——“数字舞蹈 ...

随机推荐

  1. webpack用了manifest为何还是每次都生成新的vendor?

    原来的代码 //用于提取公共代码 new webpack.optimize.CommonsChunkPlugin({ //记得要在开头引入webpack names: ['vendor','manif ...

  2. java笔试之参数解析(正则匹配)

    在命令行输入如下命令: xcopy /s c:\ d:\, 各个参数如下: 参数1:命令字xcopy 参数2:字符串/s 参数3:字符串c:\ 参数4: 字符串d:\ 请编写一个参数解析程序,实现将命 ...

  3. 《代码整洁之道》ch5~ch9读书笔记 PB16110698(~3.15) 第二周

    <代码整洁之道>ch5~ch9读书笔记 本周我阅读了本书的第5~9章节,进一步了解整洁代码需要注意的几个方面:格式.对象与数据结构.错误处理.边界测试.单元测试和类的规范.以下我将分别记录 ...

  4. scull 中的设备注册

    在内部, scull 使用一个 struct scull_dev 类型的结构表示每个设备. 这个结构定义为: struct scull_dev { struct scull_qset *data;  ...

  5. 洛谷P3834【模板】可持久化线段树 1(主席树)

    题目背景 这是个非常经典的主席树入门题--静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入输 ...

  6. Qt连接sql server数据库遇到的问题

        在QT中使用addDataBase添加一个数据库连接,其中第一个参数应该填入使用数据库驱动的类型,如QMYSQL.QSQLLITE.QSQLPSSQL等. QSqlDatabase QSqlD ...

  7. UVA - 374

    https://vjudge.net/problem/19685/origin 费马小定理优化快速幂 因为加了费马小定理优化,小心2 2 2这种情况,会出现0 0 2,也就是0的0次方,实际答案为0 ...

  8. 容斥原理——hdu3208

    和hdu2204有点像 这题要特别注意精度问题,如pow的精度需要自己搞一下,然后最大的longlong可以设为1<<31 /* 只要求[1,n]范围内的sum即可 那么先枚举幂次k[1, ...

  9. B/S架构及其运行原理

    一. B/S的概念 B/S(Brower/Server,浏览器/服务器)模式又称B/S结构,是Web兴起后的一种网络结构模式.Web浏览器是客户端最主要的应用软件. 这种模式统一了客户端,将系统功能实 ...

  10. 2019/10/9 CSP-S 模拟测

    T1:最大约数和 给定一个正整数 S,现在要求你选出若干个互不相同的正整数,使得它们的和不大于 S,而且每个数的因数(不包括本身)之和最大.S <= 1000 分析: 其实考完才听他们说是背包, ...