当前位置: 首页 > news >正文

[THUWC 2018] 字胡串

只需要使用 Z 函数的单 \(\log\) 解法,不依赖于字符集大小。

考虑固定 \(B\),比较从 \(x, y\) 插入谁更优(\(x < y\))。删除掉公共的前后缀可知等价于比较 \(B + A_{x + 1 \sim y}\)\(A_{x + 1 \sim y} + B\) 的字典序。

有一个经典结论:比较 \(A + B\)\(B + A\) 的字典序,等价于比较 \(A^{+\infty}\)\(B^{+\infty}\) 的字典序。

证明:考虑用比较 \(c = |\Sigma| + 1\) 进制小数来表示比较字典序。设 \(A, B\) 对应的小数分别为 \(a, b\)\(0 \leq a, b < 1\))。则 \(A + B < B + A\) 当且仅当 \(a + \frac b {c^{|a|}} < b + \frac a {c^{|b|}}\),当且仅当 \(a \times \frac {c^{|a|}} {c^{|a|} - 1} < b \times \frac {c^{|b|}} {c^{|b|} - 1}\),当且仅当 \(A^{+\infty} < B^{+\infty}\)

所以,\(x\)\(y\) 优当且仅当 \(B^{+\infty} \leq A_{x + 1 \sim y}^{+\infty}\)

考虑如果对 \(B^{+\infty}\) 扫描线,则答案单调不降。考虑先把询问按照 \(B^{+\infty}\) 排序,再决策单调性分治。问题转化为求单组询问的答案。如果可以 \(\mathcal O(|A| + |B|)\) 解决单组询问,那整个问题的复杂度就是单 \(\log\)

考虑如何高效地比较 \(B + A_{x + 1 \sim y}\)\(A_{x + 1 \sim y} + B\) 的字典序。如果 \(y - x < |B|\),那么问题比较容易解决:先比较 \(B_{1 \sim y - x}\)\(A_{x + 1 \sim y}\),预处理 \(B + \texttt{\#} + A\) 的 Z 函数后可以 \(\mathcal O(1)\) 判断;如果相等,再比较 \(B_{y - x + 1 \sim |B|}\)\(B_{1 \sim |B| - (y - x)}\),同样可以 \(\mathcal O(1)\) 判断;如果还相等,最后比较 \(A_{x + 1 \sim y} = B_{1 \sim y - x}\)\(B_{|B| - (y - x) + 1 \sim |B|}\),仍然可以 \(\mathcal O(1)\) 判断。

如果 \(y - x \geq |B|\),设 \(A_{x + 1 \sim y} = B^k C\),其中 \(B\) 不是 \(C\) 的前缀,则问题等价于比较 \(B + C\)\(C + B\) 的字典序,仍然可以使用 \(y - x < |B|\) 的情况的方法解决。至于如何求出 \(k\),双指针即可。

代码:

#include <bits/stdc++.h>
using namespace std;#define rep(i, a, b) for(int i = (a); i <= (b); ++i)
#define sz(x) (int)(x).size()
using ll = long long;const int N = 1e6 + 10;
int n, q;
string a;
pair<string, int> qry[N];
int ans[N];int z[2 * N];void get_z(const string &s) {int l, r = 1;rep(i, 2, sz(s) - 1) {if(i <= r && z[i - l + 1] <= r - i) {z[i] = z[i - l + 1];continue;}z[i] = max(0, r - i + 1);while(s[z[i] + 1] == s[z[i] + i]) ++z[i];}
}bool cmp(const string &b, int lo, int x, int y) {int len = sz(b) - 1;int t = z[sz(b) + x - lo + 1];if(t < min(y - x, len)) return b[t + 1] < a[x + t + 1];assert(y - x < len);t = z[y - x + 1];if(t < len - (y - x)) return b[y - x + t + 1] < b[t + 1];t = z[len - (y - x) + 1];if(t < y - x) return b[t + 1] < b[len - (y - x) + t + 1];return true;
}void solve(int l, int r, int lo, int hi) {if(l > r) return;int mid = (l + r) >> 1;string b = " " + qry[mid].first;get_z(b + "#" + a.substr(lo + 1, hi - lo));int len = sz(b) - 1;int res = lo, j = lo;rep(i, lo + 1, hi) {if(i - j >= len && z[sz(b) - lo + j + 1] >= len) j += len;if(j < i && !cmp(b, lo, j, i)) res = j = i;}ans[qry[mid].second] = res;solve(l, mid - 1, lo, res);solve(mid + 1, r, res, hi);
}int main() {cin.tie(0)->sync_with_stdio(0);cin >> n >> q >> a, a = " " + a;rep(i, 1, q) {cin >> qry[i].first;qry[i].second = i;}sort(qry + 1, qry + q + 1, [&](auto x, auto y) -> bool {return x.first + y.first < y.first + x.first;});solve(1, q, 0, n);rep(i, 1, q) cout << ans[i] << "\n";
}
http://www.jsqmd.com/news/12871/

相关文章:

  • 2025 年钢结构厂家推荐榜:箱型H型/厂房仓库/电厂/桥梁/农牧业/锅炉/场馆/高层框架/装配式钢结构工厂,聚焦安全与品质,助力建筑项目精准选品
  • 2025 年粮库空调厂家最新推荐榜:聚焦技术创新与实用适配,助力粮库精准选购优质设备粮库空调一体机/粮库空调机组/碳钢喷塑粮库空调/低温粮库空调厂家推荐
  • 2025 年最新推荐!泳池除湿热泵厂家推荐榜单重磅发布,全方位解析优质厂家实力助您选对设备双模式/多功能/三集一体/全直流变频/室内/变频式泳池除湿热泵厂家推荐
  • django template filter safe escapejs json_script等
  • 2025年GEO(AI搜索优化)厂家口碑推荐排行榜
  • 2025年GEO(AI搜索优化)源头厂家权威推荐榜单:云视有客科技领跑行业新纪元
  • 2025年GEO服务商口碑推荐榜单:顶尖AI搜索优化厂家全方位解析
  • 2025年GEO(AI搜索优化)厂家口碑推荐榜:云视有客科技领跑行业创新
  • 2025企业聊天软件排行 5款好用的通讯软件推荐
  • 【触想智能】工业安卓一体机在人工智能领域上的市场应用分析
  • Redis中的线程模型 - 浪矢
  • 2025 年油气回收设备厂家最新推荐排行榜:加油站 / 油库 / 码头 / 化工厂适用优质品牌精选
  • Vue3 + OpenLayers + 天地图 简单集成
  • 基于 PyTorch 完全从零手搓 GPT 混合专家 (MOE) 对话模型 - 详解
  • Linux环境下安装Jenkins2.346.3
  • 2025 年疲劳试验机厂家最新推荐排行榜:涵盖液压 / 电动 / 扭转等多类型设备,助力企业精准挑选优质厂家
  • 2025 年万能试验机厂家最新推荐排行榜:涵盖电子 / 液压 / 拉力 / 压力 / 冲击等类型,助力企业科研机构精准选购优质设备
  • 2025 年涡流分离器源头厂家最新推荐排行榜:聚焦国内优质企业,助力制造企业精准采购可靠分离设备旋转分配器/油路分配器/离心过滤器厂家推荐
  • 欧美(美股、加拿大股票、墨西哥股票)股票数据接口文档
  • 2025年GEO(AI搜索优化)服务商口碑排行榜
  • 为了这0.1 dB,他在实验室蹲了整整8年
  • vue播放rtsp流方案
  • 有范同城全民任务小程序管理系统:连接厂家与播主的高效协作平台
  • 2025年GEO(AI搜索优化)源头厂家权威推荐榜单:云视有客科技领跑行业
  • axi_ad9361_rx.v
  • 2025年GEO(AI搜索优化)公司口碑推荐排行榜单
  • ​个人微信机器人开发
  • Kong Gateway 实操实例:代理上游服务并配置限流插件 - 指南
  • 2025 年最新二手手机交易公司推荐排行榜:聚焦企业的专业与诚信实力,为消费者精选可靠选择
  • 项目管理中的批量更新如何帮助节省时间和工作量?