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

[AT_nikkei2019_2_final_h] 逆にする関数 题解

观察函数,发现 \(f(1) = a_n, f(n) = a_1, ......\) 其实描述了一种对应关系,如果一个对应矛盾则该序列不合法。

考虑 \(O(n^2)\) 的暴力怎么写,枚举区间的中点,向左右拓展维护是否合法,和已知的对应关系。

发现这个过程和求回文串很像,考虑 manacher,manacher 的一个重要性质就是 box 左右对称的两个区间的回文半径在没有超出 box 范围的情况下是一样的,不难验证新“回文”也满足这个性质。

所以在没有超出 box 范围的情况下直接继承回文半径,否则需要将回文半径缩到 box 内,直接搞要上可持久化数据结构,不过我们可以证明,每次暴力一个一个缩复杂度均摊是 \(O(n)\) 的,每缩一个新的贡献可以找到后继来快速计算。

证明:每次缩一个都会使 box 的左端点向右移动一格,因为当前点的最长回文半径包含的区间一定会成为新的 box(两个 box 如果右端点相同取左端点最大的),而只有拓展回文半径的操作会减少左端点,不过右端点始终递增,所以这个操作最多减少 \(n\) 个,均摊下来最多会有 \(2n\) 次缩的操作。

时间复杂度线性。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <ctime>
#define int long long
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
typedef long double ld;
const int N = 6e5 + 10, mod = 998244353;int n, m, a[N], b[N], idx, f[N], pw[N], ne[N], pre[N], lst[N], d[N], ans[N], cnt[N];signed main() {ios::sync_with_stdio(0), cin.tie(0);clock_t stt = clock();cin >> n >> m; pw[0] = 1;for(int i = 1; i < N; i ++) pw[i] = pw[i - 1] * m % mod;for(int i = 1; i <= n; i ++) cin >> a[i];for(int i = 1; i <= n; i ++)b[++ idx] = a[i], b[++ idx] = 0;for(int i = 0; i <= m; i ++) lst[i] = idx + 5;for(int i = idx; i; i --) {ne[i] = lst[b[i]];pre[lst[b[i]]] = i;lst[b[i]] = i;}for(int i = 1, l = 1, r = 0; i <= idx; i ++) {if(i <= r) {d[i] = d[l + r - i], ans[i] = ans[l + r - i], cnt[i] = cnt[l + r - i];while(i + d[i] - 1 > r) {int p = l + r - i;if(b[p - d[i] + 1]) {ans[i] = (ans[i] - pw[m - cnt[i]]) % mod;if(ne[p - d[i] + 1] > idx || ne[p - d[i] + 1] >= p + d[i] - 1) {cnt[i] -= 1 + (b[p - d[i] + 1] != b[p + d[i] - 1]);}    }d[i] --;}}while(i - d[i] >= 1 && i + d[i] <= idx) {int x = (ne[i - d[i]] > i + d[i] - 1 ? 0 : b[i * 2 - (ne[i - d[i]])]), y = (pre[i + d[i]] < i - d[i] + 1 ? 0 : b[i * 2 - (pre[i + d[i]])]);if(!b[i - d[i]]) {d[i] ++;continue;}if(!x && !y) {if(b[i - d[i]]) {cnt[i] += (b[i - d[i]] != b[i + d[i]]) + 1, ans[i] = (ans[i] + pw[m - cnt[i]]) % mod;}d[i] ++;}else {if(x == b[i + d[i]] && y == b[i - d[i]]) ans[i] = (ans[i] + pw[m - cnt[i]]) % mod, d[i] ++;else break;}}if(i + d[i] - 1 >= r) r = i + d[i] - 1, l = i - d[i] + 1;}int res = 0;for(int i = 1; i <= idx; i ++)(res += ans[i]) %= mod;cout << (res + mod) % mod << '\n';cerr << (1.0 * clock() - stt) / CLOCKS_PER_SEC << "s\n";return 0;
}
http://www.jsqmd.com/news/21014/

相关文章:

  • 一文剖析 丨什么是多模态大模型?
  • 【linux内核】super_lock
  • OPPO手机“绿线”障碍争议,高价等于高端,何以分食iPhone市场?
  • k8s中nginx和headless服务搭配使用引发的小问题
  • 2025 年家用电梯厂家最新推荐榜单:实力厂商安全性能与定制优势深度解析,助别墅 / 自建房用户精准选购适配产品
  • SpringBoot整合SpringDoc
  • GEO靠谱推荐:GEO技术开启精准农业与资源管理新纪元 - 勤懒调和者
  • 下一代 AI Agent 的基石:Real-Time AI 新基建丨Convo AIRTE2025
  • 2025 年水性透水地坪专用漆制造商最新推荐榜:聚焦企业专利技术、品质管控及知名客户合作案例的权威解析
  • 区间摩尔投票 - 教程
  • 一张图讲清楚企业微信的好友和群
  • 中国企业DevOps工具链选型:本土化适配与安全可控成关键考量
  • 技术拐点将至:AI 大模型的挑战突围与产业重构 - 指南
  • 详细介绍:如何将华为手机的照片转移到电脑
  • Executing System Commands in Python - ENGINEER
  • 【读论文】AI笔记(一)9月26日组会前 - 教程
  • 2025中国DevOps平台选型全景洞察:本土化与安全可控成关键考量
  • 增强AI股票预测分析报告 - 2025年10月24日 - 10:18:59
  • 容器主机名解析在香港服务器内部网络的调试方案 - 教程
  • win10开始安装vs2022时闪退问题记录
  • 领取快手的3个月的 KAT-Coder-Pro V1 编程 Tokens 资源包
  • (WebSocket)心理咨询管理系统开发ing......
  • NACOS 2.4.1 数据库表详解
  • 2025 年硅砂模块实力厂家最新推荐排行榜:涵盖新型 / 第三代承插型等多类型产品,多维度解析优质企业优势
  • 1基础的UActorComponent基类实现功能模块化
  • 2025 泳池设备厂家专业解决方案与设备优势,推荐 Firsle 法思乐,全产业链服务解析
  • 2025年10月杭州模拟人开发公司对比榜:服务链路深度拆解
  • 医用制氧机哪家好?2025医用制氧机厂家权威排行榜
  • NativeMessaging通信失败问题
  • 2025年10月自行车品牌评价榜:十款热门车型数据对比