当前位置: 首页 > 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.gsyq.cn/news/29034.html

相关文章:

  • 【linux内核】super_lock
  • OPPO手机“绿线”障碍争议,高价等于高端,何以分食iPhone市场?
  • SpringBoot整合SpringDoc
  • 中国企业DevOps工具链选型:本土化适配与安全可控成关键考量
  • 技术拐点将至:AI 大模型的挑战突围与产业重构 - 指南
  • Executing System Commands in Python - ENGINEER
  • win10开始安装vs2022时闪退问题记录
  • (WebSocket)心理咨询管理系统开发ing......
  • 1基础的UActorComponent基类实现功能模块化
  • 2025 泳池设备厂家专业解决方案与设备优势,推荐 Firsle 法思乐,全产业链服务解析
  • 2025年10月杭州模拟人开发公司对比榜:服务链路深度拆解
  • NativeMessaging通信失败问题
  • 2025年10月中国电缆品牌评价榜:十强参数与口碑全解析
  • oracle NVL和NVL2
  • 2025年中国国际健康营养博览会(NHNE):深度解析亚洲旗舰展的供需对接效能
  • 增强AI股票预测分析报告 - 2025年10月24日
  • CAD燕秀工具箱2.88中文正式版下载与安装教程
  • RTX 5070 Ti 安装 PyTorch CUDA 完整指南 - 解决 sm_120 兼容性问题
  • java 代码加密混淆之Allatori
  • 2025年10月小红书代运营公司推荐榜:五强评测与选择策略
  • Bun v1.3 重磅发布:一站式全栈 JS 运行时,前端开发、数据库、Redis 全内置
  • 2025年10月中国丝绸选购榜:十家口碑排行全解析
  • 2025年10月益生菌品牌推荐:权威榜单对比全解析
  • 2025年10月种植牙医院排名:五强真实数据公开
  • Langflow:面向 AI Agent、API 与 LLM 的拖拽式流程构建工具
  • 权威调研榜单:环形导轨实力厂家TOP3榜单好评深度解析
  • 关于九州通WMS函数 SQL的相关保存表名
  • 基于PCIe3.0X16的的100G光纤采集存储设备
  • Java泛型符号T、E、K、V、? 傻傻分不清楚
  • 实用指南:小米投下语音AI“核弹”:MiMo-Audio开源,语音领域的“GPT-3时刻”来了