博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P2463 [SDOI2008]Sandy的卡片
阅读量:6465 次
发布时间:2019-06-23

本文共 2040 字,大约阅读时间需要 6 分钟。

题意分析

首先对于一个可以匹配的字符串

我们发现 差分之后出除了最后一位外是相等的

A 1 4 6 7B 3 6 8 2差分之后A 3 2 1 -3B 3 2 -6 2

所以我们要求的就是拆分之后最长匹配长度+1

首先 我们将差分之后的拼成一个长串

然后建出\(SA\)

发现答案具有可二分性

然后我们再使用\(height\)数组 将\(lcp≥now\)的后缀分成一组

如果存在共计\(n\)个串后缀分成一组

说明答案存在

CODE:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long#define inf 0x7fffffff#define N 100008#define IL inline#define M 2008611#define D double#define maxn 30000#define R registerusing namespace std;template
IL void read(T &_){ T __=0,___=1;char ____=getchar(); while(!isdigit(____)) {if(____=='-') ___=0;____=getchar();} while(isdigit(____)) {__=(__<<1)+(__<<3)+____-'0';____=getchar();} _=___ ? __:-__;}/*-------------OI使我快乐-------------*/int n,m,key,maxx,tot;int s[M],tmp[M],vis[M],rnk[M],SA[M],cdy[M],wzy[M],hei[M];int bel[M],sta[M];IL void Rsort(){ for(R int i=0;i<=key;++i) vis[i]=0; for(R int i=1;i<=n;++i) vis[cdy[i]]++; for(R int i=1;i<=key;++i) vis[i]+=vis[i-1]; for(R int i=n;i;--i) SA[vis[cdy[wzy[i]]]--]=wzy[i];}IL void get_SA(){ for(R int i=1;i<=n;++i) cdy[i]=s[i],wzy[i]=i;Rsort(); for(R int x=1;x<=n;x<<=1) { int cnt=0; for(R int i=n-x+1;i<=n;++i) wzy[++cnt]=i; for(R int i=1;i<=n;++i) if(SA[i]>x) wzy[++cnt]=SA[i]-x; Rsort();swap(cdy,wzy);cdy[SA[cnt=1]]=1; for(R int i=2;i<=n;++i) cdy[SA[i]]=(wzy[SA[i]]==wzy[SA[i-1]]&&wzy[SA[i]+x]==wzy[SA[i-1]+x] ? cnt:++cnt); if(cnt==n) break; else key=cnt; }}IL void get_hei(){ for(R int i=1;i<=n;++i) rnk[SA[i]]=i; int lat,k=0; for(R int i=1;i<=n;++i) { if(k) --k; lat=SA[rnk[i]-1]; while(s[lat+k]==s[i+k]) ++k; hei[rnk[i]]=k; }}IL bool check(int now){ ++tot;int cnt=0; for(R int i=1;i<=n;++i) { if(hei[i]
>1; if(check(mid)) ans=mid,le=mid+1; else ri=mid-1; } printf("%d\n",ans+1);// for(R int i=1;i<=n;++i) printf("%d%c",SA[i],(i==n ? '\n':' '));// fclose(stdin);// fclose(stdout); return 0;}

HEOI 2019 RP++

转载于:https://www.cnblogs.com/LovToLZX/p/10652769.html

你可能感兴趣的文章
Adb移植(一)简单分析
查看>>
Linux VNC server的安装及简单配置使用
查看>>
阿里宣布开源Weex ,亿级应用匠心打造跨平台移动开发工具
查看>>
Android项目——实现时间线程源码
查看>>
招商银行信用卡重要通知:消费提醒服务调整,300元以下消费不再逐笔发送短信...
查看>>
python全栈_002_Python3基础语法
查看>>
C#_delegate - 调用列表
查看>>
交换机二层接口access、trunk、hybird三种模式对VLAN的处理过程
查看>>
jQuery.extend 函数详解
查看>>
[转]Windows的批处理脚本
查看>>
lnmp高人笔记
查看>>
子程序框架
查看>>
多维数组元素的地址
查看>>
数据库运维体系_SZMSD
查看>>
福大软工1816 · 第三次作业 - 结对项目1
查看>>
selenium多个窗口切换
查看>>
静态库 调试版本 和发布版本
查看>>
JAVA中的finalize()方法
查看>>
慕课网学习手记--炫丽的倒计时效果Canvas绘图与动画基础
查看>>
==与equals()的区别
查看>>