【GDOI 2014】beyond
来源:互联网 发布:淘宝站内推广有哪些 编辑:程序博客网 时间:2024/05/17 04:35
Description
给出两个串,求循环同构的最长前缀长度
1 <= N <= 2,000,000
Analysis
A,B两个串循环同构,大概就如下图,两个串红色部分,白色部分分别相等
判断相等的话容易想到用扩展KMP的ext数组
给两个串互相做扩展KMP,得到exta,extb
如果枚举A串分界点
j<=exta[i] extb[j]>=i
则可以更新答案
我们的任务其实就是对于每个
朴素的做法是让j从exta[i]到1搜一遍,找到第一个extb[j]>=i的位置pos
注意到第二个约束
这相当于一个指针指过去,而且带有并查集思想的路径压缩
Code
#include<cstdio>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)using namespace std;const int N=2000005;char s1[N],s2[N];int n,f[N],nxt[N],ext1[N],ext2[N];void exkmp(char *a,char *b,int *c){ memset(nxt,0,sizeof(nxt)); memset(c,0,sizeof(c)); nxt[1]=n; int p=0,mx=0; fo(i,2,n) { nxt[i]=nxt[i-p+1]; if(i+nxt[i]>mx) { nxt[i]=max(0,mx-i+1); while(i+nxt[i]<=n && b[i+nxt[i]]==b[nxt[i]+1]) nxt[i]++; p=i,mx=i+nxt[i]-1; } } p=mx=0; fo(i,1,n) { c[i]=nxt[i-p+1]; if(i+c[i]>mx) { c[i]=max(0,mx-i+1); while(i+c[i]<=n && a[i+c[i]]==b[c[i]+1]) c[i]++; p=i,mx=i+c[i]-1; } }}int getfa(int v,int k){ if(!v) return 0; if(ext2[v+1]>=k) return v; else return f[v]=getfa(f[v],k);}int main(){ scanf("%d\n%s\n%s",&n,s1+1,s2+1); exkmp(s1,s2,ext1); exkmp(s2,s1,ext2); int ans=0; fo(i,1,n) f[i]=i-1; fo(i,1,n) { int x=getfa(ext1[i],i-1); if(x) ans=max(ans,i+x-1); } printf("%d",ans); return 0;}
0 0
- 【GDOI 2014】beyond
- Beyond
- BEYOND
- Beyond
- beyond
- Beyond
- beyond
- beyond
- GDOI 总结
- GDOI总结
- GDOI 加油
- 2017 GDOI
- 2017gdoi
- 2017GDOI
- 备战GDOI
- JavaScript Beyond the Web in 2014 http://www.sitepoint.com/javascript-beyond-web-2014/
- GDOI 3.21 模拟总结
- GDOI改题小结
- javascript-MDN笔记-函数
- IO复用之epoll
- Python(Pygame)字体设置
- Jenkins+Maven+Git搭建持续集成和自动化部署的配置手记
- Jquery和javascript在使用上的区别
- 【GDOI 2014】beyond
- LeetCode 523. Continuous Subarray Sum 解题报告
- visual studio常用快捷键
- Jenkins + Git + Maven + tomcat集成环境(转)
- 曼哈顿距离
- MySQL数据库基础(一)(启动-停止、登录-退出、语法规范及最基础操作)(持续更新中)
- Google Analytics中的基本度量四 “页面停留时间和网站停留时间”
- Filezilla无法确定拖放操作目标,由于shell未正确安装__解决办法
- Delphi中如何将鼠标放置在控件上就给予提示信息