2018ECfinal J. Philosophical Balance
2018ECfinal J. Philosophical Balance
题目大意:
给出一个字符串 \(s\) ,你需要给每一个 \(i\) 一个 \([0,1]\) 之间的权值 \(k_i\) ,且满足 \(\sum k_i=1\) 。并且最小化
\]
先证明一个比较简单的结论,把 \(s\) 的后缀树建出来,考虑后缀树的每一个子树,如果子树的根是 \(s\) 的一个后缀,那么分配到这个子树里面的所有权值必然全部分配到根上。
假设这个子树 \(u\) 里第 \(i\) 个节点分配了 \(k_i\) 的权值,那么对于根的贡献是 \(\sum{k_i}\times len_{u}\) ,考虑对其它点的贡献是每一个权值乘在其某个祖先的 \(len\) 上,由于 \(len\) 向上递减,根的贡献固定,那么显然全部放在根上最优。
设 \(f(u)\) 为后缀树上 \(u\) 节点所在子树内部的答案,当 \(u\) 是后缀节点的时候 \(f(u)=len(fa_u)-len(u)\) 。否则只需要合并每一个儿子的 \(f(v)\) 。
考虑儿子与儿子之间是独立的,不同儿子之间的 \(lcp\) 都是 \(u\) ,也就是说 \(u\) 代表的串无论 \(i\) 是什么都会被算 \(\sum k_i=1\) 的系数。那么 \(u\) 到父亲的边直接加上去就可以。然后剩下的东西是一个纳什均衡的模型,可以当做博弈来理解,最优解的一定是每个儿子的贡献相等,乱推一波可以得到式子:
f_1k_1 = f_2k_2=\dots= f_mk_m= x \\
\sum \frac{x}{f_i}=1 \\
\frac{1}{x} = \sum \frac{1}{f_i} \\
x = \frac{1}{\sum \frac{1}{f_i}}
\]
其实上面那个证明带进去发现当根节点是后缀节点的时候贡献是相等的,打表一下应该不难看出这个后面那个结论了,之后 \(\mathcal O(n)\) 算一算就做完了。
/*program by mangoyang*/
#pragma GCC optimize("Ofast", "inline")
#include <bits/stdc++.h>
#define inf (0x7f7f7f7f)
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
typedef long long ll;
using namespace std;
template <class T>
inline void read(T &x){
int ch = 0, f = 0; x = 0;
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
for(; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
if(f) x = -x;
}
#define double long double
const int N = 500005;
vector<int> vec[N];
char s[N];
ll all, val[N]; int n, cnt;
namespace SAM{
vector<int> g[N];
int ch[N][26], pos[N], fa[N], len[N], size = 1, tail = 1;
inline int newnode(int x){ return len[++size] = x, size; }
inline void ins(int c, int x){
int p = tail, np = newnode(len[p] + 1); pos[np] = x;
for(; p && !ch[p][c]; p = fa[p]) ch[p][c] = np;
if(!p) return (void) (fa[np] = 1, tail = np);
int q = ch[p][c];
if(len[q] == len[p] + 1) fa[np] = q;
else{
int nq = newnode(len[p] + 1);
fa[nq] = fa[q], fa[q] = fa[np] = nq;
for(int i = 0; i < 26; i++) ch[nq][i] = ch[q][i];
for(; p && ch[p][c] == q; p = fa[p]) ch[p][c] = nq;
}tail = np;
}
inline void addedge(){
for(int i = 2; i <= size; i++) g[fa[i]].push_back(i);
}
inline double gao(int u, int d){
if(pos[u]) return d;
double res = 0;
for(int i = 0; i < (int) g[u].size(); i++)
res += 1.0 / gao(g[u][i], len[g[u][i]] - len[u]);
return 1.0 / res + d;
}
}
int main(){
int T; read(T);
while(T--){
for(int i = 1; i <= SAM::size; i++){
SAM::g[i].clear();
SAM::pos[i] = SAM::fa[i] = SAM::len[i] = 0;
memset(SAM::ch[i], 0, sizeof(SAM::ch[i]));
}
SAM::tail = SAM::size = 1;
scanf("%s", s + 1); n = strlen(s + 1);
for(int i = n; i; i--) SAM::ins(s[i] - 'a', i);
SAM::addedge();
printf("%.10Lf\n", SAM::gao(1, 0));
}
}
2018ECfinal J. Philosophical Balance的更多相关文章
- 【做题】ECFinal2018 J - Philosophical … Balance——dp
原文链接 https://www.cnblogs.com/cly-none/p/ECFINAL2018J.html 题意:给出一个长度为\(n\)的字符串\(s\),要求给\(s\)的每个后缀\(s[ ...
- 2018 EC-Final 部分题解 (A,J)
目录 The 2018 ICPC Asia-East Continent Final A.Exotic - Ancient City(思路 并查集) J.Philosophical - Balance ...
- POJ 1013 Counterfeit Dollar
Counterfeit Dollar Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 36206 Accepted: 11 ...
- asp.net使用MVC4框架基于NPOI做导出数据到Excel表
NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目. 使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 ...
- POJ 1013 Counterfeit Dollar 集合上的位运算
Description Sally Jones has a dozen Voyageur silver dollars. However, only eleven of the coins are t ...
- poj1837挂砝码
解法(背包DP问题) (下为转) 其实感觉 像此题这种类型的并不属于dp范畴 虽然程序看起来使用的是递推这一过程,但总不能说开个二重循环就是dp吧 如果只从求解上来讲(不考虑数据值的范围), 只有枚举 ...
- LB(Load balance)负载均衡集群--{LVS-[NAT+DR]单实例实验+LVS+keeplived实验} 菜鸟入门级
LB(Load balance)负载均衡集群 LVS-[NAT+DR]单实例实验 LVS+keeplived实验 LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一 ...
- POJ1837 Balance[分组背包]
Balance Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 13717 Accepted: 8616 Descript ...
- Codeforces Beta Round #17 C. Balance DP
C. Balance 题目链接 http://codeforces.com/contest/17/problem/C 题面 Nick likes strings very much, he likes ...
随机推荐
- TED_Topic2:My desperate journey with a human smuggler
My desperate journey with a human smuggler By Barat Ali Batoor When I was a child there was a toy wh ...
- 第七周 ch04 课下测试补交
2017-2018-1 20155335 <信息安全系统设计基础>第7周 课下测试博客 本人不慎忘记去交dao'zhi 测试题目: SEQ+对SEQ的改变有() A . PC的计算挪到取指 ...
- Django之ModelForm(一)
要说ModelForm,那就先说Form吧! 先给出一个Form示例: models.py from django.db import models class UserType(models.Mod ...
- html5手机Web单页应用实践--起点移动阅读
一开始以hybrid形式做了一个android的小说阅读客户端,叫4G阅读.而后由于业务需求,要迅速实现纯手机html5 版的,所以就直接在原先客户端内内嵌的网页进行改版,快速实现以后在优化的过程中发 ...
- layui实现类似于bootstrap的模态框功能
以前习惯了bootstrap的模态框,突然换了layui,想的用layui实现类似于bootstrap的模态框功能. 用到了layui的layer模块,例如: <!DOCTYPE html> ...
- vsftpd 安装配置详细教程
linux下ftp软件不少,大致特点:<br /> wu-ftp:比较老牌,但针对它的攻击比较多,设置比较麻烦,但功能比较强大.<br /> vsftpd:功能强大,配置也比较 ...
- hash算法搜索获得api函数地址的实现,"kernel32.dll", "CreateThread"
我们一般要获得一个函数的地址,通常采用的是明文,例如定义一个api函数字符串"MessageBoxA",然后在GetProcAddress函数中一个字节一个字节进行比较.这样弊端很 ...
- 64_p5
php-nette-bootstrap-2.4.3-1.fc26.noarch.rpm 20-Feb-2017 07:19 16290 php-nette-caching-2.5.3-1.fc26.n ...
- juery给所有ID属性相同的div绑定一个事件
案例: <div id="div1">内容</div> <div id="div1">内容</div> < ...
- 斐讯路由器L(联)B(壁)K-码兑换包安全下车通道(图文教程)
大家好,最近大家比较关心的斐讯路由器如何下车问题,楼主亲自试提取了一遍,记录下过程,欢迎大家一起讨论. 言归正传,上图,上图! No.1 打开斐讯提供的良心k码退换通道: https://tech-s ...