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

MX 暑假集训 7.26

【Mili】world.execute(me);

咋是我最不会的字符串啊。呜呜呜根本不会各种板子。

留着以后巩固完各类字符串板子再接着写吧。

[POI 2012] PRE-Prefixuffix

题意

对于两个字符串 \(S_1,S_2\),如果能将 \(S_1\) 的一个后缀移动到开头使 \(S_1\) 变成 \(S_2\),就称 \(S_1\)\(S_2\) 循环同构。

给定一个字符串 \(S\),找到一个长度 \(L\le \frac{\lvert S\rvert}{2}\),使得 \(S\) 长度为 \(L\) 的前缀与长度为 \(L\) 的后缀循环同构。

\(1\le \lvert S\rvert \le 10^6\)

solution

两个字符串循环同构当且仅当它们分别可以写成 \(AB\)\(BA\) 的形式,那么我们可以考虑 \(S\) 的每个 Border,用它的长度加上将其删去后得到字符串的最长 Border 长度更新答案,那么如何求这个字符串删去一个前缀和一个后缀后得到新字符串的最长 Border 长度呢?

考虑从中间依次加入元素,维护 \(p\) 表示当前字符串长度不大于当前长度一半的最长 Border 长度,发现每在左右各加入一个元素,\(p\) 至多增加 \(2\),那么每次加入时我们直接令 \(p\leftarrow p+2\),然后判断 \(p\) 是否满足上述条件,不满足就 \(p\leftarrow p-1\),直到满足为止,这样就能求出删去一个前缀和后缀后新字符串最长 Border,由于 \(p\) 每次最多增加 \(2\),那么复杂度均摊 \(O(n)\)

然后枚举原字符串的每个 Border 并更新答案即可,判断长度为 \(p\) 的前缀是否是 Border 可以直接用哈希,后面枚举 Border 时也可以直接哈希,不用写 KMP。

时间复杂度 \(O(n)\)

还有一种做法是构造字符串 $s_1s_ns_2s_{n-1}s_3s_{n-2}\dots $,那么转化为求 最长双回文串,感觉这个构造比较反直觉感兴趣可以去看题解,时间复杂度同样是 \(O(n)\),这里不多介绍。

Code
#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
#define qwq Ff472130
#define f(i,l,r) for (int i=l;i<=r;i++)
#define F(i,l,r) for (int i=l;i>=r;i--)
constexpr int N=1e6+10;
constexpr int inf=1e6+10;inline void read(int &x) {x=0;char ch=getchar();while (ch<48) ch=getchar(); while (ch>=48) x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
}int n,ans;
int f[N];
char s[N];struct Hash {int B,M;ll mp[N],fac[N];inline void get_Hash(int _B,int _M) {B=_B;M=_M;fac[0]=1;f(i,1,n) fac[i]=fac[i-1]*B%M,mp[i]=(mp[i-1]*B+s[i]-'a'+1)%M;}inline ll H(int l,int r) {return (mp[r]-mp[l-1]*fac[r-l+1]%M+M)%M;}
}H1,H2;
inline bool check(int l1,int r1,int l2,int r2) {return (H1.H(l1,r1)==H1.H(l2,r2))&&(H2.H(l1,r1)==H2.H(l2,r2));}int main() {read(n);scanf("%s",s+1);H1.get_Hash(131,1e9+97);H2.get_Hash(31,998244853);int l=n/2,r=n/2+1+(n&1),now=-1,mx=n/2;while (l) {now+=2;while (l+now-1>=r-now+1) now--;while (now&&!check(l,l+now-1,r-now+1,r)) now--;f[l]=now;l--;r++;}f(i,1,mx) if (check(1,i,n-i+1,n)) ans=max(ans,i+f[i+1]);printf("%d\n",ans);return 0;
}
http://www.jsqmd.com/news/1269367/

相关文章:

  • BiliBili-UWP第三方客户端:Windows桌面端最完整的B站观影解决方案
  • 3分钟掌握:Windows原生APK安装器终极指南
  • 多场景 Solidity 合约模式复用:从 DeFi 到 RWA 的可组合模块化合约架构设计
  • Arduino PZEM-004T电能监测库:5分钟快速上手智能电表集成指南
  • 3.4万Token、1511行全部扒光!Claude Opus 5提示词泄露全解读:它被要求记住你,却必须假装忘了你
  • Llamatop:MacBook多核CPU实时监控与性能优化实战
  • 如何永久保存微信聊天记录:WeChatMsg留痕的完整指南
  • 9行Python代码构建AI智能体:从基础实现到实战扩展
  • TI DSP音频串行端口(ASP)复位与初始化实战指南
  • 如何快速构建私有AI伴侣:离线AI工作站完整指南
  • 5分钟极速上手:Windows原生运行安卓应用的最佳解决方案
  • 构建高精度电能监测系统:PZEM-004T Arduino库企业级集成方案
  • 3分钟上手:JPEGView快速图片查看与编辑完整指南
  • 动态路由与MoE协同设计的轻量级视觉语言模型实践
  • 2026惠州黄金回收哪家靠谱?惠奢汇领衔正规门店排行榜+避坑指南 - 生活测评小能手
  • 生成式AI赋能大学英语告诫语言能力培养平台-开发日志(Day 9)
  • AI工具链加速学术写作:4天完成SSCI论文的高效工作流
  • 量化交易中的金融市场情绪指标构建与应用
  • MoeVoiceStudio:轻松打造专属二次元语音的终极免费工具
  • 别再用规则引擎了!2024最前沿的多目标贝叶斯优化分配框架,已落地金融/制造/物流三大高敏场景
  • RemixIcon 图标库完全指南:如何为你的项目快速添加2500+专业图标
  • 华为TCX转换器:3分钟解锁华为健康数据自由
  • F3D 3D查看器完整指南:5个技巧快速掌握轻量级3D可视化工具
  • 2026 年安次知名的K9 级球墨铸铁管生产商哪家可靠,烧毁管路?揭秘K9级球墨铸铁的超强韧性秘密-世盛铸造球墨铸铁管 - 行业推荐官【认证】
  • UD动作游戏开发读书笔记--. 编辑器本身的基础知识
  • 2026年Solstice索致泰核心代理商揭秘 - 品牌排行榜
  • 2026年7月电动车怎么叫上门托运?这5家品牌优缺点大起底,第1个真香 - 快递物流资讯
  • 从项目复盘到AIOps最佳实践库:故障知识单元(FKU)结构化建模与双引擎检索架构的构建
  • 智能搜索技术:MCP与OpenSearch的电商实践
  • 剪映AI智能抠像实操手册(新手3分钟上手,老手效率翻倍的7个隐藏参数)