我可以大喊一声这就是个套路题吗?

首先看到LCP问题,那么套路的想到SAM(SA的做法也有)

LCP的长度是它们在parent树上的LCA(众所周知),所以我们考虑同时统计多个点之间的LCA对

树上问题的话请出万能算法——LCT(这里准确的说应该是实链剖分),我们只需要不停地access就可以找到LCA了

然后怎么统计最后的答案,区间询问用莫队?这里的两个信息(最大值,边的虚实)显然都不能撤销

我们直接大力离线,从左往右把点一个个扔到LCT上,然后对于每个点开一个树状数组维护后缀最大值,由于这里只有加入操作显然是合法的

那么问题就变成怎么维护树状数组了,这个也很套路,在LCT上打懒标记当splay的时候下传即可

CODE

#include<cstdio>
#include<cctype>
#include<vector>
#define RI register int
#define CI const int&
#define Tp template <typename T>
using namespace std;
const int N=100005;
int n,m,x,len[N<<1],anc[N<<1],id[N],ans[N],L[N],tot; vector <int> v[N];
class FileInputOutput
{
private:
static const int S=1<<21;
#define tc() (A==B&&(B=(A=Fin)+fread(Fin,1,S,stdin),A==B)?EOF:*A++)
#define pc(ch) (Ftop<S?Fout[Ftop++]=ch:(fwrite(Fout,1,S,stdout),Fout[(Ftop=0)++]=ch))
char Fin[S],Fout[S],*A,*B; int Ftop,pt[15];
public:
Tp inline void read(T& x)
{
x=0; char ch; while (!isdigit(ch=tc()));
while (x=(x<<3)+(x<<1)+(ch&15),isdigit(ch=tc()));
}
inline void get_digit(int& x)
{
char ch; while (!isdigit(ch=tc())); x=ch&15;
}
Tp inline void write(T x)
{
if (!x) return (void)(pc('0'),pc('\n')); RI ptop=0;
while (x) pt[++ptop]=x%10,x/=10; while (ptop) pc(pt[ptop--]+48); pc('\n');
}
inline void Fend(void)
{
fwrite(Fout,1,Ftop,stdout);
}
#undef tc
#undef pc
}F;
class Suffix_Automation
{
private:
int ch[N<<1][2],lst;
public:
inline Suffix_Automation() { lst=tot=1; }
inline void expand(CI c,CI pos)
{
int now=++tot,fa=lst; id[pos]=lst=now; len[now]=len[fa]+1;
while (fa&&!ch[fa][c]) ch[fa][c]=now,fa=anc[fa];
if (!fa) return (void)(anc[now]=1); int x=ch[fa][c];
if (len[fa]+1==len[x]) return (void)(anc[now]=x);
int y=++tot; ch[y][0]=ch[x][0]; ch[y][1]=ch[x][1];
anc[y]=anc[x]; len[y]=len[fa]+1; anc[now]=anc[x]=y;
while (fa&&ch[fa][c]==x) ch[fa][c]=y,fa=anc[fa];
}
}SAM;
class Tree_Array
{
private:
int mx[N];
inline void maxer(int& x,CI y)
{
if (y>x) x=y;
}
public:
#define lowbit(x) x&-x
inline void add(RI x,CI y)
{
for (;x;x-=lowbit(x)) maxer(mx[x],y);
}
inline int get(RI x,int ret=0)
{
for (;x<=n;x+=lowbit(x)) maxer(ret,mx[x]); return ret;
}
#undef lowbit
}BIT;
class Link_Cut_Tree
{
private:
struct splay
{
int ch[2],fa,val,tag;
}node[N<<1]; int stack[N<<1],top;
#define lc(x) node[x].ch[0]
#define rc(x) node[x].ch[1]
#define fa(x) node[x].fa
#define V(x) node[x].val
#define T(x) node[x].tag
inline void pushdown(CI now)
{
if (T(now)) T(lc(now))=V(lc(now))=T(rc(now))=V(rc(now))=T(now),T(now)=0;
}
inline int identify(CI now)
{
return rc(fa(now))==now;
}
inline void connect(CI x,CI y,CI d)
{
node[fa(x)=y].ch[d]=x;
}
inline bool isroot(CI now)
{
return lc(fa(now))!=now&&rc(fa(now))!=now;
}
inline void rotate(CI now)
{
int x=fa(now),y=fa(x),d=identify(now);
if (!isroot(x)) node[y].ch[identify(x)]=now; fa(now)=y;
connect(node[now].ch[d^1],x,d); connect(x,now,d^1);
}
inline void splay(int now)
{
int t=now; while (stack[++top]=t,!isroot(t)) t=fa(t);
while (top) pushdown(stack[top--]); for (;!isroot(now);rotate(now))
t=fa(now),!isroot(t)&&(rotate(identify(now)!=identify(t)?now:t),0);
}
public:
inline void init(void)
{
for (RI i=1;i<=tot;++i) fa(i)=anc[i];
}
inline void access(int x,CI pos,int y=0)
{
for (;x;x=fa(y=x)) splay(x),BIT.add(V(x),len[x]),rc(x)=y; T(y)=V(y)=pos;
}
#undef lc
#undef rc
#undef fa
#undef V
#undef T
}LCT;
int main()
{
//freopen("A.in","r",stdin); freopen("A.out","w",stdout);
RI i; for (F.read(n),F.read(m),i=1;i<=n;++i)
F.get_digit(x),SAM.expand(x,i); for (i=1;i<=m;++i)
F.read(L[i]),F.read(x),v[x].push_back(i);
for (LCT.init(),i=1;i<=n;++i)
{
LCT.access(id[i],i); for (int it:v[i]) ans[it]=BIT.get(L[it]);
}
for (i=1;i<=m;++i) F.write(ans[i]); return F.Fend(),0;
}

LOJ #6041. 「雅礼集训 2017 Day7」事情的相似度的更多相关文章

  1. 【刷题】LOJ 6041 「雅礼集训 2017 Day7」事情的相似度

    题目描述 人的一生不仅要靠自我奋斗,还要考虑到历史的行程. 历史的行程可以抽象成一个 01 串,作为一个年纪比较大的人,你希望从历史的行程中获得一些姿势. 你发现在历史的不同时刻,不断的有相同的事情发 ...

  2. loj#6041. 「雅礼集训 2017 Day7」事情的相似度(SAM set启发式合并 二维数点)

    题意 题目链接 Sol 只会后缀数组+暴躁莫队套set\(n \sqrt{n} \log n\)但绝对跑不过去. 正解是SAM + set启发式合并 + 二维数点/ SAM + LCT 但是我只会第一 ...

  3. loj#6041. 「雅礼集训 2017 Day7」事情的相似度(后缀自动机+启发式合并)

    题面 传送门 题解 为什么成天有人想搞些大新闻 这里写的是\(yyb\)巨巨说的启发式合并的做法(虽然\(LCT\)的做法不知道比它快到哪里去了--) 建出\(SAM\),那么两个前缀的最长公共后缀就 ...

  4. LOJ #6041. 「雅礼集训 2017 Day7」事情的相似度 LCT+SAM+线段树

    Code: #include<bits/stdc++.h> #define maxn 200003 using namespace std; void setIO(string s) { ...

  5. #6041. 「雅礼集训 2017 Day7」事情的相似度 [set启发式合并+树状数组扫描线]

    SAM 两个前缀的最长后缀等价于两个点的 \(len_{lca}\) , 题目转化为求 \(l \leq x , y \leq r\) , \(max\{len_{lca(x,y)}\}\) // p ...

  6. 「雅礼集训 2017 Day7」事情的相似度

    「雅礼集训 2017 Day7」事情的相似度 题目链接 我们先将字符串建后缀自动机.然后对于两个前缀\([1,i]\),\([1,j]\),他们的最长公共后缀长度就是他们在\(fail\)树上对应节点 ...

  7. 【LOJ 6041】「雅礼集训 2017 Day7」事情的相似度

    Description 人的一生不仅要靠自我奋斗,还要考虑到历史的行程. 历史的行程可以抽象成一个 01 串,作为一个年纪比较大的人,你希望从历史的行程中获得一些姿势. 你发现在历史的不同时刻,不断的 ...

  8. LOJ6041. 「雅礼集训 2017 Day7」事情的相似度 [后缀树,LCT]

    LOJ 思路 建出反串的后缀树,发现询问就是问一个区间的点的\(lca\)的深度最大值. 一种做法是dfs的时候从下往上合并\(endpos\)集合,发现插入一个点的时候只需要把与前驱后继的贡献算进去 ...

  9. 【loj6041】「雅礼集训 2017 Day7」事情的相似度 后缀自动机+STL-set+启发式合并+离线+扫描线+树状数组

    题目描述 给你一个长度为 $n$ 的01串,$m$ 次询问,每次询问给出 $l$ .$r$ ,求从 $[l,r]$ 中选出两个不同的前缀的最长公共后缀长度的最大值. $n,m\le 10^5$ 题解 ...

随机推荐

  1. SSM-MyBatis-10:Mybatis中SqlSession的getMapper()和简单的工具类MyBatisUtils

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- getMapper的作用,获取到接口,直接通过点的方式调用方法,以免直接手打的方式写错方法名,(强类型的方式) ...

  2. Spring Boot 定制URL匹配规则的方法

    事情的起源:有人问我,说编写了一个/hello访问路径,但是吧,不管是输入/hello还是/hello.html,还是/hello.xxx都能进行访问.当时我还以为他对代码进行处理了,后来发现不是,后 ...

  3. OAuth 2 Developers Guide

    Introduction This is the user guide for the support for OAuth 2.0. For OAuth 1.0, everything is diff ...

  4. junit+mock+spring-test构建后台单元测试

    from:从0开始,构建前后端分离应用 1. 一些基本概念 1.1 为什么要进行单元测试?我自己的理解是 1.能够快速发现问题.避免衍生BUG的出现     在对一些现有代码进行修改时,或者修改现有B ...

  5. ubuntu下dpkg、phantomjs安装包下载地址

    dpkg下载地址 http://download.chinaunix.net/download/0003000/2377.shtml phantomjs下载地址 https://bitbucket.o ...

  6. python日期格式化操作

    1.将字符串的时间转换为时间戳 方法: a = "2013-10-10 23:40:00" #将其转换为时间数组 import time timeArray = time.strp ...

  7. python获取日期加减之后的日期

    python语言中的datetime模块可以利用其中的方法获取不同的日期,比如获取当前日期.明天.昨天.上个月.下个月和明年.下面利用几个实例说明这些日期的获取方法,操作如下:     第一步,利用d ...

  8. Visual Studio Code Tips

    新项目要用到Visual Studio Code, 在使用的过程中有些tips, 记录下来以便查阅. 1. 自动保存代码 文件 => 自动保存 2. 帮助输入代码模式 扩展 => 安装HT ...

  9. fiddler抓包软件的使用--请求头--ajax

    User-Agent: FiddlerHost: localhost:49828Content-Length: 0Accept: application/xmlContent-Type: applic ...

  10. Elasticsearch笔记八之脑裂

    Elasticsearch笔记八之脑裂 概述: 一个正常es集群中只有一个主节点,主节点负责管理整个集群,集群的所有节点都会选择同一个节点作为主节点所以无论访问那个节点都可以查看集群的状态信息. 而脑 ...