codeforces 616F Expensive Strings (广义后缀自动机)

https://codeforces.com/contest/616/problem/F

题意:

给你n个字符串串,串SiS_iSi​的权值为cic_ici​,对于一个字符串sss有函数
F(s)=∑i=1nci∗ps,i∗∣s∣F(s)=\sum_{i=1}^{n}c_i*p_{s,i}*|s|F(s)=i=1∑n​ci​∗ps,i​∗∣s∣
其中ps,ip_{s,i}ps,i​为字符串sss在串SiS_iSi​中出现的次数。
让你构造一个sss使得F(s)F(s)F(s)最大,输出F(s)F(s)F(s)即可。

题解:

先考虑单独一个串SiS_iSi​怎么做。
对这个串SiS_iSi​建SAM,对于每一个节点ststst,实际上它的贡献就是∣endpos(st)∣∗ci∗maxlen(st)|endpos(st)|*c_i*maxlen(st )∣endpos(st)∣∗ci​∗maxlen(st)
而对于多个串,其实是一样的。直接用广义后缀自动机做就好啦

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
const int mod=1e9+7;
#define pb push_back
#define fi first
#define se second
#define all(x) (x).begin(),(x).end()
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--)
typedef long long ll;
typedef double db;
typedef vector<int> vi;
typedef pair<int,int> pii;
ll qpow(ll a,ll b){ll ans=1;a%=mod;assert(b>=0);for(;b;b>>=1){if(b&1)ans=ans*a%mod;a=a*a%mod;}return ans;}
ll gcd(ll a,ll b){return b>0?gcd(b,a%b):a;}
int n,m,T;
string s[maxn];
int c[maxn];
struct SAM{int nxt[maxn<<1][30];int link[maxn<<1];int step[maxn<<1];ll sum[maxn<<1];int sz,last,rt;void init(){sz=last=rt=1;}void add(int c){int p=last;int np=++sz;last=np;step[np]=step[p]+1;memset(nxt[np],0,sizeof nxt[np]);while(!nxt[p][c]&&p){nxt[p][c]=np;p=link[p];}if(p==0){link[np]=rt;}else{int q=nxt[p][c];if(step[q]==step[p]+1){link[np]=q;}else{int nq=++sz;memcpy(nxt[nq],nxt[q],sizeof nxt[q]);link[nq]=link[q];link[np]=link[q]=nq;step[nq]=step[p]+1;while(nxt[p][c]==q&&p){nxt[p][c]=nq;p=link[p];}} }}int a[maxn<<1],b[maxn<<1];void build(){for(int i=1;i<=sz;i++) a[step[i]]++;for(int i=1;i<=sz;i++) a[i]+=a[i-1];for(int i=1;i<=sz;i++) b[a[step[i]]--]=i;}void solve(){for(int i=1,p;i<=n;i++){p=rt;for(auto ch:s[i]){p=nxt[p][ch-'a'];sum[p]+=c[i];}}for(int i=sz,u,fa;i>=1;i--){u=b[i],fa=link[b[i]];sum[fa]+=sum[u];}ll res=0;for(int i=1;i<=sz;i++){res=max(res,1ll*sum[i]*step[i]);}cout<<res<<endl; }
}sam;
int main(){sam.init();cin>>n;for(int i=1;i<=n;i++){cin>>s[i];sam.last=1;for(auto c:s[i]){sam.add(c-'a');}}for(int i=1;i<=n;i++)cin>>c[i];sam.build();sam.solve();
//  cin>>n>>m;return 0;
}
/*
5
bbbb
baaa
bbba
aaba
bbaa
17 -17 -82 47 -85
*/

codeforces 616F Expensive Strings相关推荐

  1. [Educational Round 5][Codeforces 616F. Expensive Strings]

    这题调得我心疲力竭...Educational Round 5就过一段时间再发了_(:з」∠)_ 先后找了三份AC代码对拍,结果有两份都会在某些数据上出点问题...这场的数据有点水啊_(:з」∠)_[ ...

  2. CodeForces - 985F Isomorphic Strings

    假如两个区间的26的字母出现的位置集合分别是 A1,B1,A2,B2,....., 我们再能找到一个排列p[] 使得 A[i] = B[p[i]] ,那么就可以成功映射了. 显然集合可以直接hash, ...

  3. codeforces 112APetya and Strings(字符串水题)

    A. Petya and Strings 点击打开题目 time limit per test 2 seconds memory limit per test 256 megabytes input ...

  4. CodeForces - 985F Isomorphic Strings(字符串哈希)

    题目链接:点击查看 题目大意:首先规定同构字符串,若字符串s和字符串t互为同构字符串,则必须满足: 两个字符串长度相同 s中的字符种类数与t中的字符种类数相同 s中的每一个字母在t中都有对应,且必须是 ...

  5. codeforces E. Picking Strings 构造

    题目链接 Picking String 题意 给出字符串S和T,1e5个询问,每次询问S的一段区间是否能转变成T的一段区间. 转变方式: A>BCA>BCA>BC B>ACB& ...

  6. codeforces 149E . Martian Strings kmp

    题目链接 给一个字符串s, n个字符串str. 令tmp为s中不重叠的两个连续子串合起来的结果, 顺序不能改变.问tmp能形成n个字符串中的几个. 初始将一个数组dp赋值为-1. 对str做kmp, ...

  7. 2016区域赛前冲刺训练

    UPD 2016.10.23 shift-and (2题) Codeforces 训练 现在已经完成了: 191 [Codeforces Round #377] (6/6) Div 2 A Buy a ...

  8. Codeforce 水题报告(2)

    又水了一发Codeforce ,这次继续发发题解顺便给自己PKUSC攒攒人品吧 CodeForces 438C:The Child and Polygon: 描述:给出一个多边形,求三角剖分的方案数( ...

  9. CodeForces616:Educational Round 5

    文章目录 前言 A Comparing Two Long Integers\text{A Comparing Two Long Integers}A Comparing Two Long Intege ...

最新文章

  1. js获取html代码中所有图片地址
  2. smart-socket如何实现字符串通信
  3. PyTorch 1.3发布:能在移动端部署,支持Colab云TPU,阿里云上也能用
  4. 独家 | 一文读懂人工神经网络
  5. Lync Server 2010标准版系列PART1:基础构建
  6. 不懂AI的我,是如何搞开发的?
  7. Centos Ftp
  8. Linux2.6内核 -- 编码风格(1)
  9. openfoam linux教程,科学网—Windows10 安装OpenFOAM 教程 - 陈浩的博文
  10. 类似QQ右上角选项弹框
  11. react-native 环境配置遇到的问题
  12. linux执行python命令后permission denied
  13. path r'c test.html',robot framework - robot命令参数解析
  14. Scala中=gt;的用法
  15. python中、if语句的下一句一定要缩进吗_【python公开课|Python if else对缩进的要求是什么,想做好python,就一定要看这个文章】- 环球网校...
  16. 怎么用计算机同步文件夹,DSynchronize同步电脑本地文件夹教程
  17. 手机也可以接USB摄像头了
  18. java时间管理番茄时钟小程序源码
  19. [读书] 《未来世界的幸存者》关于熵减的心得
  20. 【2023王道数据结构】【树与二叉树】通过C++实现中序遍历的非递归算法(手动入出栈)C、C++完整实现(可直接运行

热门文章

  1. github使用ssh方式
  2. Go语言Web项目搭建
  3. PHP论坛开发技术总结
  4. Java 生成 outLook .msg 文件
  5. 机器学习中的数学——常用概率分布(二):范畴分布(Multinoulli分布)
  6. 浏览器中的data类型的Url格式,data:image/png,data:image/jpeg!
  7. Unity3D调用Android提供的接口
  8. WRF-Chem emission guide
  9. eNSP实验日记二划分Vlan
  10. SAS JAVA基础开发包下载