简要题意

给出一个长度为n的字符串s[1],由小写字母组成。定义一个字符串序列s[1....k],满足性质:s[i]在s[i-1] (i>=2)中出现至少两次(位置可重叠),问最大的k是多少,使得从s[1]开始到s[k]都满足这样一个性质。

\(n\le 200000\)

Sol

一道适合练习SAM的right集合神题 + 神仙结论题

结论(1)

每次只算\(s[i-1]\)\(s[i]\)的后缀的情况,显然是不会影响答案的。

因为如果\(s[i-1]\)不是\(s[i]\)的后缀,那么我们把不与\(s[i-1]\)匹配的那后面一截都去掉,\(s[i]\)就会变短。

如果没变短之前它在某一个字符串里出现过了,那么变短后显然还是出现过的。

这个结论是显然的,也比结论(2)容易理解。

建立后缀自动机。
容易想到直接在parent树上自上向下DP;

考虑如何判断x的祖先y所代表的子串是否在x中出现了两次:
\(len[x]\)表示\(x\)代表的最长子串长度,假设\(x\)\(right\)集合中存在一个位置\(p\)
那么\(p\)显然已经在\(y\)\(right\)集合中了,
我们只要判断\(y\)\(right\)集合中有没有一个元素,
在区间\([pos(x)-len(x)+len(y),pos(x)-1]\)中判断y串是否出现两次即可。

这个容易线段树合并完成。

可以发现,我们以上的做法都只考虑父亲代表的最长串都必须出现在x代表的最长串中。

这样有没有问题呢?又如何dp呢?

结论(2)

设s是某个节点u表示的最长串,v是u的祖先(即串的后缀),
则v表示的所有字符串在s上的匹配情况是等价的(即不会出现有的能匹配、有的不能)。

证明的话,我们举个例子:

\((1)\ \ \ \ \ \ abcb\)

\((2)\ \ \ \ babcb\)

\((s)\ \ \ \ \ \ abcbabcb\)

考虑反证:

假设这里(s)的后缀(1)(2)均为v节点表示的串,(1)成功匹配而(2)不行。

因为(2),所有显然还存在着这个串:

\((3)\ \ \ \ babcbabcb\)

又因为(s)表示的已经是u的最长串了,所以(3)串一定来自另一个节点。

设(3)串来自另一个节点w,u是w的祖先。

根据定义知
\[ |Right(u)| > |Right(w)| \]

这样,则一定存在一个位置p
\[p ∈Right(u) - Right(w)\]
在这个位置只出现了(s)串而没有(3)串。

这样就存在一个位置使得只出现(1)串而没有(2)串。

这样得到(1)(2)两串\(Right\)集合不同??

这与它们来自同一个节点矛盾!

证毕.

有了结论(2),我们就可以设计dp状态了:

\(dp[i]\)表示使用节点i最长的那个字符串的答案,
转移的时候可以直接使用祖先节点j最长的那个字符串转移(因为都等价啊)

这样一来整个dp过程都是忽略那部分短串的,就非常自然了。

这个dp显然可以倍增,容易做到线性(对深度Two-pointer)。

#include<set>
#include<map>
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define pb push_back
#define fi first
#define se second
#define mp make_pair
using namespace std;typedef double db;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pi;const int N=400005;char S[N];
int n,tot(1),la,ch[N][26],len[N],fa[N],pos[N],rt[N],cnt,rk[N],ar[N],dp[N],fr[N],Ans;struct node {int lc,rc;
}t[N*20];void Upd(int &u,int l,int r,int p)
{if(!u)u=++cnt;if(l!=r){int m=(l+r)>>1;if(m>=p) Upd(t[u].lc,l,m,p);else Upd(t[u].rc,m+1,r,p);}
}int Merge(int x,int y,int l,int r)
{if(!x||!y)return x+y;int o=++cnt;if(l!=r){int m=(l+r)>>1;t[o].lc=Merge(t[x].lc,t[y].lc,l,m);t[o].rc=Merge(t[x].rc,t[y].rc,m+1,r);}return o;
}int Query(int u,int l,int r,int L,int R)
{if(!u||l>R||r<L)return 0;if(l>=L&&r<=R)return 1;int m=(l+r)>>1;return Query(t[u].lc,l,m,L,R)||Query(t[u].rc,m+1,r,L,R);
}void extend(int id,int where)
{int p=la;int np=++tot;len[np]=len[p]+1;pos[np]=where;while(p && !ch[p][id]){ch[p][id]=np;p=fa[p];}if(!p){fa[np]=1;}else{int q=ch[p][id];if(len[p]+1==len[q]){fa[np]=q;}else{int nq=++tot;len[nq]=len[p]+1;fa[nq]=fa[q];pos[nq]=pos[q];for(int i=0; i<26; i++)ch[nq][i]=ch[q][i];fa[np]=fa[q]=nq;while(p && ch[p][id]==q){ch[p][id]=nq;p=fa[p];}}}la=np;Upd(rt[la],1,n,where);
}void Sort()
{for(int i=1; i<=tot; i++) ar[len[i]]++;for(int i=1; i<=n; i++) ar[i]+=ar[i-1];for(int i=1; i<=tot; i++) rk[ar[len[i]]--]=i;
}int main()
{scanf("%d%s",&n,S+1);la=1;for(int i=1; i<=n; i++) extend(S[i]-'a',i);Sort();for(int i=tot; i!=1; i--){int u=rk[i],v=fa[u];rt[v]=Merge(rt[v],rt[u],1,n);}for(int i=2; i<=tot; i++){int u=rk[i],v=fa[u];if(v==1){dp[u]=1;fr[u]=u;}else if(Query(rt[fr[v]],1,n,pos[u]-len[u]+len[fr[v]],pos[u]-1)){dp[u]=dp[v]+1;fr[u]=u;}else{dp[u]=dp[v];fr[u]=fr[v];}Ans=max(Ans,dp[u]);}printf("%d",Ans);return 0;
}

转载于:https://www.cnblogs.com/bestwyj/p/10847198.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/277752.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/277752.shtml
英文地址,请注明出处:http://en.pswp.cn/news/277752.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Google的“机器人情结”:两次合计36亿美元的人工智能收购

据Re/code1月27日消息&#xff0c;Google将收购&#xff08;据知情人透露约4亿美元&#xff0c;未经证实&#xff09;一家人工智能公司DeepMind。DeepMind公司位于英国伦敦&#xff0c;由神经系统科学家DemisHassabis、网络语音通讯软件Skype开发者JaanTallin和研究人员ShaneLe…

Mac OS使用技巧之八:Dock栏使用技巧

本篇博客&#xff0c;我们来讲一下Mac OS的标志性的东西————Dock。在我们的第七篇系列博客里面已经提及了神秘强大的Dock栏。这是苹果的一大亮点。Dock中间偏右侧有一条浅浅的分割线。分割线左侧是APP的图标&#xff0c;在运行的下面会有白色光点。分割线右侧是堆栈&#x…

man:命令帮助使用手册

man&#xff1a;在linux中作为手册存在&#xff0c;含义就是命令的使用手册 在man命令的帮助使用手册中&#xff0c;其中的常用按键及其用途如下所示 按键 用处 空格键 向下翻一页 PaGe down …

报错,但不影响运行ERROR: JDWP Unable to get JNI 1.2 environment, jvm-GetEnv() return code = -2...

eclipse 3.4jdk1.6 编译正常通过&#xff0c;运行debug模式时报错 ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code -2 JDWP exit error AGENT_ERROR_NO_JNI_ENV(183): [../../../src/share/back/util.c:820] 查找该错误原因。发现是重定向输出…

Mac OS使用技巧之九:Mission Control和DIY自己的Dashboard

一、Mission Control使用技巧Mac OS X为我们提供了更加无缝和流畅的多桌面、应用管理和切换&#xff0c;Mission Control。之前的教程里面也提到过。触摸板四指向上平移&#xff08;可以在系统偏好里面设成三指&#xff09;&#xff0c;就可以调出高端大气的Mission Control。包…

【NOIP必备攻略】 基本noilinux使用方法

现在linux系统已经成为了NOIP竞赛的一大操作系统&#xff0c;如果连最基础的操作都不会&#xff0c;那就更别提怎么得分了&#xff0c;万一操作失误&#xff0c;可就爆零了。所以小编特意发这样一篇博客&#xff0c;教你快速上手noilinux&#xff01; ▎ 常用操作 1&#xff09…

1067: 有问题的里程表

[提交][状态][讨论版][命题人:admin]题目描述 某辆汽车有一个里程表&#xff0c;该里程表可以显示一个整数&#xff0c;为该车走过的公里数。然而这个里程表有个毛病&#xff1a;它总是从3变到5&#xff0c;而跳过数字4&#xff0c;里程表所有位&#xff08;个位、 十位、百位等…

Mac OS使用技巧之十:Finder的详细使用方法

Finder就是Mac OSX中资源管理器&#xff0c;我们用它来管理我们所有的文件。先来说一下Finder的打开方法吧&#xff0c;&#xff08;1&#xff09;单击Dock上的Finder图标。&#xff08;2&#xff09;快捷键为【command】向上方向键或者【command】【N】下面我们来看一下10.9 M…

css中图片有缩放和转动效果

现在html中利用div来包裹住一张图片。 <div class"xuanzhuan"><img src"images/top.png" alt""></div> 然后在css中利用固定定位来将图片固定好&#xff0c;再利用动画的效果即可出来。 .xuanzhuan {position: fixed;top: 20%…

7.6 yum更换国内源 7.7 yum下载rpm包 7.8/7.9 源码包安装

2019独角兽企业重金招聘Python工程师标准>>> 7.6.yum更换国内源 自定义yum源&#xff1a; [rootbogon ~]# cd /etc/yum.repos.d [rootbogon yum.repos.d]# ls CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo CentOS-CR.repo …

Mac OS使用技巧之十一:隐藏launchpad中图标的方法

开讲前注释&#xff1a;一个逗比公司&#xff1d;adobe公司&#xff0c;成立于1982年&#xff0c;总部位于加利福尼亚。Launchpad是Mac系统的一大特色&#xff0c;借鉴了IOS系统的APP存放方式&#xff0c;图形化的浏览应用程序&#xff0c;而非是在文件中死板的浏览&#xff0c…

MySQL数据库入门到高薪培训教程(从MySQL 5.7 到 MySQL 8.0)

一、MySQL数据库入门到高薪培训视频教程&#xff08;从MySQL5.7到MySQL8.0&#xff09; 本套MySQL学习教程地址&#xff1a; https://edu.51cto.com/course/18034.html 为满足想快速入门学习MySQL的学员&#xff0c;风哥设计一套比较全面的MySQL新手快速入门学习视频课程。 本…

双因素认证方案

一、 网络安全认证的需求背景 网络钓鱼、欺诈等网络犯罪现象已经达到非常严峻的情况&#xff0c;用户如果只依赖个人密码进行帐户登录或网上交易&#xff0c;是非常危险和不可靠的认证方法。针对这些问题&#xff0c;北京中科恒伦科技有限公司推出基于动态令牌的双因素身份认证…

Mac OS使用技巧之十二:解决APP Store更新、下载出错的问题

前面介绍了Mac OSX那么多强大的功能和各式各样的使用技巧&#xff0c;那么苹果系统有没有让人头疼的地方呢&#xff1f;恐怕APP Store的下载问题一直是困扰许多用户的永恒问题&#xff0c;为什么有的时候就可以下&#xff0c;为什么有的时候就不可以下&#xff1f;可能是因为网…

解决:设置中打开蓝牙,測试机不会自己主动搜索设备

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主同意不得转载。https://blog.csdn.net/huangyabin001/article/details/36027575 【操作步骤】&#xff1a;设置中打开蓝牙&#xff0c;測试机不会自己主动搜索设备【測试结果】&#xff1a;设置中打开蓝牙&#xff…

Xshell替代品 -- FinalShell

对于运维人员来说&#xff0c; 使用的最常用的远程终端连接工具无非就是crt或者Xshell, 而crt则需要破解才能使用&#xff0c; Xshell虽说可以免费使用&#xff0c; 但经常在启动的时候会要求你购买&#xff0c; 然后一直卡住不让你启动&#xff0c; 既耽误了工作时间又需要浪费…

Mac OS使用技巧之十三:Finder中标记的使用

我们直入主题&#xff0c;在Mac系统中&#xff0c;我们可以为文件添加不同颜色、不同数量的标记来强调其重要性或者表示其种类 &#xff08;现在说的标记&#xff0c;就是以前版本里面的标签&#xff0c;觉得没有以前版本的标记明显&#xff0c;好看&#xff09;如下图&#x…

Spring mvc 上下文初始化过程

为什么80%的码农都做不了架构师&#xff1f;>>> 在软件开发的中&#xff0c;如果某些特性的使用比较普遍&#xff0c;那么这些特性往往可以作为平台特性来实现&#xff0c;通过对这些平台特性进行有效的封装&#xff0c;使其向其他应用开放。正是如此&#xff0c;S…

经典七大排序算法

经典排序算法在面试中占有很大的比重&#xff0c;也是基础&#xff0c;为了未雨绸缪&#xff0c;在寒假里整理并用Python实现了七大经典排序算法&#xff0c;包括冒泡排序&#xff0c;插入排序&#xff0c;选择排序&#xff0c;希尔排序&#xff0c;归并排序&#xff0c;快速排…

谁能给我讲讲原理——视频弹幕游戏!!

舍友在一个叫BliBli的视频网站上找到这样一个视频弹幕游戏&#xff0c;说实话我当时一看真的惊呆了。 从来没有见过这种能够互动的、充满游戏性的视频&#xff0c;用户WASD可以控制飞机移动躲避字幕&#xff0c;撞到字幕左上角死亡次数还可以计数&#xff0c;字幕还并不是单一…