文章目录

  • 题意
  • 题解
  • 代码

题意

  • 给 NNN 个字符串,第 iii 个字符串的第 kkk 个位置(从 111 开始)都有权值 AkiA_k^iAki​。
  • 定义 Q(i,j,k)=popularity(Sj,ki)×Aki×∣Sj,ki∣Q(i, j, k)=popularity(S_{j,k}^{i}) \times A_k^i \times |S_{j,k}^i|Q(i,j,k)=popularity(Sj,ki​)×Aki​×∣Sj,ki​∣
    • popularity(str)popularity(str)popularity(str) 表示字符串 strstrstr 是这 NNN 个字符串中多少个的前缀
    • Sj,kiS_{j,k}^iSj,ki​ 为第 iii 个字符串的 jjj 到 kkk 的子串
    • ∣str∣|str|∣str∣ 表示字符串 strstrstr 的长度
  • 求 Q(i,j,k)Q(i, j, k)Q(i,j,k) 的最大值

1≤N≤1051\le N \le 10^51≤N≤105,字符串长度之和 ≤105\le 10^5≤105,0≤Aki≤1090\le A_k^i\le 10^90≤Aki​≤109

题解

对着 N 个串建立 AC自动机。一个节点的 popularity(Sj,ki),∣Sj,ki∣popularity(S_{j,k}^{i}) ,|S_{j,k}^i|popularity(Sj,ki​),∣Sj,ki​∣ 值是固定的。
在 fail 树上,一个节点的所有父亲节点的都会对当前匹配的字符串产生贡献,所以沿着 fail 树,预处理每一个节点到根的 popularity(Sj,ki)×∣Sj,ki∣popularity(S_{j,k}^{i}) \times |S_{j,k}^i|popularity(Sj,ki​)×∣Sj,ki​∣ 的最大值。
这样把这 NNN 个串分别在 AC 自动机上匹配一遍,顺便统计答案即可。

代码

#include <bits/stdc++.h>#define mem(f, v) memset(f,v,sizeof(f))
#define file(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);typedef long long ll;
const int maxn = 100010;
const int inf = ~(1u << 31u);
const ll linf = ~(1llu << 63u);using namespace std;vector<vector<int>> va;
vector<string> s;struct ACAM_node {ll val;int num, dep;vector<ACAM_node *> ch;ACAM_node *fail;ACAM_node(int chSZ = 26) : num(0), val(0), fail(nullptr) {ch.resize(chSZ, nullptr);}
} po[maxn];ACAM_node *get(int idx) {po[idx].val = po[idx].num = po[idx].dep = 0;po[idx].ch.clear(), po[idx].fail = nullptr;po[idx].ch.resize(26, nullptr);return po + idx;
}struct ACAM {ACAM_node *root;int cnt;ACAM() : cnt(0) {root = get(cnt++);}void add(const string &str) {ACAM_node *now = root;for (auto c:str) {int idx = c - 'a';if (now->ch[idx] == nullptr) now->ch[idx] = get(cnt++);now->ch[idx]->num++;now = now->ch[idx];}}void build() {queue<ACAM_node *> q;root->fail = nullptr;for (auto &x: root->ch)if (x) {x->fail = root;x->dep = 1;x->val = (ll)x->dep * x->num;q.push(x);}else x = root;while (!q.empty()) {auto u = q.front();q.pop();for (int i = 0; i < u->ch.size(); i++) {auto &x = u->ch[i];if (x) {x->fail = u->fail->ch[i];x->dep = u->dep + 1;x->val = max(x->fail->val, (ll) x->dep * x->num);q.push(x);} else x = u->fail->ch[i];}}}ll query(const string &str, int index) {ACAM_node *now = root;ll mx = 0;for (int i = 0; i < str.length(); i++) {int idx = str[i] - 'a';now = now->ch[idx];mx = max(mx, now->val * va[index][i]);}return mx;}
};int main() {ios::sync_with_stdio(false);freopen("exciting.in", "r", stdin);int T;cin >> T;while (T--) {s.clear(), va.clear();int n;cin >> n;for (int i = 0; i < n; i++) {string str;cin >> str;s.emplace_back(str);}for (int i = 0; i < n; i++) {vector<int> d;for (int j = 0, x; j < s[i].length(); j++) {cin >> x;d.emplace_back(x);}va.emplace_back(d);}ACAM acam;for (auto &x:s) acam.add(x);acam.build();ll res = 0;for (int i = 0; i < n; i++)res = max(res, acam.query(s[i], i));cout << res << "\n";}return 0;
}

【gym 101991 E】(ACPC 2018) E. Exciting Menus 题解相关推荐

  1. 2018 Arab Collegiate Programming Contest (ACPC 2018) E - Exciting Menus AC自动机

    E - Exciting Menus 建个AC自动机求个fail指针就好啦. #include<bits/stdc++.h> #define LL long long #define fi ...

  2. 2018 Arab Collegiate Programming Contest (ACPC 2018) G. Greatest Chicken Dish (线段树+GCD)

    题目链接:https://codeforces.com/gym/101991/problem/G 题意:给出 n 个数,q 次询问区间[ li,ri ]之间有多少个 GCD = di 的连续子区间. ...

  3. Codeforces Gym 101086 M ACPC Headquarters : AASTMT (Stairway to Heaven)

    Codeforces Gym 101086 M ACPC Headquarters : AASTMT (Stairway to Heaven) 题目来源: Codeforces 题意: 给出一些比赛, ...

  4. 2018 Arab Collegiate Programming Contest (ACPC 2018) H - Hawawshi Decryption 数学 + BSGS

    H - Hawawshi Decryption 对于一个给定的生成数列 R[ 0 ] 已知, (R[ i - 1 ] * a + b) % p = R[ i ] (p 是 质数), 求最小的 x 使得 ...

  5. 2018 Arab Collegiate Programming Contest (ACPC 2018) L.Looking for Taste(按位或)

    题目 n个数选k个,使它们的或最大 n<=1e5 k>=20 ai<=1e6 题解 从高向低位或, 每个数至少产生一位的贡献,所以最多20个数 贪心地使或的数最大即可 由于或没有副作 ...

  6. 2018深信服java笔试题_深信服2018春招笔试题解

    原文链接:点这儿. 深信服还是一如既往的"懒",2018秋招的5个编程题在本次春招出现了三道,然后添加了一道新的编程题,且选择题和填空题基本与秋招的雷同,看来之前没看深信服2018 ...

  7. 2018 软件学院 AK 杯 题解

    华南师范大学软件学院第一届AK杯于 2018 年 10 月 25 日成功举行,共有 275 名同学有效参赛(提交过代码),209 人 AC 1 题以上,最高过题数为 4 题,共 11 人. 前言 本次 ...

  8. 2018 IEEE极限编程大赛 题解

    去年742,今年72,也算一种小小的进步. 明年前30(笑 1. Drawing Rooted Binary Trees 给定一个树的中序和前序的遍历,要求输出这棵树(包括空格的) 1 #includ ...

  9. 2018 湘潭邀请赛 部分题解

    2018 湘潭邀请赛 题解 A C F G K .其它题解,后续添加 A 题 没啥好讲的,签到题 从后面往前面数,大于个数的时候直接输出就行了. AC代码: #include<iostream& ...

最新文章

  1. 谷歌最新提出无需卷积、注意力,纯MLP构成的视觉架构!网友:MLP is All You Need?
  2. Lucene.Net无障碍学习和使用:搜索篇
  3. JAVA socket编程实例 转载
  4. 2018学校计算机 远程教学工作总结,2018年远程教育工作总结范文
  5. C++中public,protected,private派生类继承问题和访问权限问题
  6. MQTT的学习之Mosquitto安装使用(1)
  7. (25)Verilog HDL循环语句:forever
  8. mysql relay log 配置_mysql relay log参数汇总
  9. mysql encode 函数_MySQL常用函数
  10. pkg_resources.ContextualVersionConflict: (pyasn1 0.1.9 (c:\users\dell\anaconda3\lib\site-packages)
  11. vbnet 判断字符串是否为空或空白
  12. RTSP、RTMP、HTTP流媒体播放器比较
  13. cubieboard服务器系统,Cubieboard 1搭建服务器安装Linux/Debian系统并移至内置Nand中
  14. 华硕路由桥接模式进入不了界面
  15. 业务流程管理的基本概念
  16. linux scp拷文件夹,linux scp远程拷贝文件及文件夹
  17. 03 Transformation 变换
  18. power automate功能概述与学习实践(Microsoft Flow)
  19. 初等行变换、初等列变换
  20. listview显示数据倒叙

热门文章

  1. 数组里的字符串转换成数字或者把数字转换成字符串
  2. C#预览(GOCAD)DWG文件方法
  3. 20190919CF训练
  4. 关于微信聊天界面更换背景
  5. 《棒球殿堂》:棒球联盟LEAGUE·东北乐天金鹫
  6. HTML figcaption 标签
  7. 5张图,看懂数据分析体系
  8. 高德Android 定位SDK示例
  9. 小米5 MIUI 10系统完全Root教程 (Root思想通用所有机型)
  10. 深度学习epochs、batch、batch_size和iteration的区分