感谢dalaoWJZ的讲解。

我们对于每一个串a[i]相当于在他parent的right集合里找一个出现位置在id-len[x]+len[parent]到id[x]-1区间的

用主席树判存在性即可。

至于我问了很久这个区间为什么不能往前判,原因是你每个节点都代表唯一一个子串,所以我们定性查询就可以啦。

By:大奕哥

 #include<bits/stdc++.h>
using namespace std;
const int N=4e5+;
int rt[N],num,n;
char s[N];
struct tree{
int l,r;
}t[N*];
void change(int &x,int l,int r,int p)
{
if(!x)x=++num;
if(l==r)return;
int mid=l+r>>;
if(p>mid)change(t[x].r,mid+,r,p);
else change(t[x].l,l,mid,p);
}
void merge(int &x,int y)
{
if(!x||!y){x=x+y;return;}
++num;t[num]=t[x];x=num;
merge(t[x].l,t[y].l);
merge(t[x].r,t[y].r);
}
bool query(int x,int l,int r,int L,int R)
{
if(!x)return ;
if(l==L&&r==R)return ;
int mid=l+r>>;
if(mid<L)return query(t[x].r,mid+,r,L,R);
else if(mid>R)return query(t[x].l,l,mid,L,R);
else return query(t[x].l,l,mid,L,mid)|query(t[x].r,mid+,r,mid+,R);
}
struct SAM
{
int cnt,root,last,c[N][],f[N],dp[N],tt[N],pos[N],r[N],id[N],l[N];
SAM(){cnt=;last=root=++cnt;}
void add(int x,int dd)
{
int now=last,a=++cnt;last=a;id[a]=dd;
l[a]=l[now]+;
for(;now&&!c[now][x];now=f[now])c[now][x]=a;
if(!now)f[a]=root;
else{
int q=c[now][x];
if(l[q]==l[now]+)f[a]=q;
else{
int b=++cnt;id[b]=dd;
l[b]=l[now]+;
f[b]=f[q];
f[a]=f[q]=b;
memcpy(c[b],c[q],sizeof(c[q]));
for(;now&&c[now][x]==q;now=f[now])c[now][x]=b;
}
}
return;
}
void sort(){
for(int i=;i<=cnt;++i)tt[l[i]]++;
for(int i=;i<=n;++i)tt[i]+=tt[i-];
for(int i=;i<=cnt;++i)r[tt[l[i]]--]=i;
return;
}
void work()
{
for(int i=cnt;i>=;--i)
{
int x=r[i];
change(rt[x],,n,id[x]);
merge(rt[f[x]],rt[x]);
}int ans=;
for(int i=;i<=cnt;++i)
{
int x=r[i];
if(f[x]==){pos[x]=x,dp[x]=;continue;}
if(query(rt[pos[f[x]]],,n,id[x]-l[x]+l[pos[f[x]]],id[x]-))
dp[x]=dp[pos[f[x]]]+,pos[x]=x;
else dp[x]=dp[pos[f[x]]],pos[x]=pos[f[x]];
ans=max(ans,dp[x]);
}
printf("%d\n",ans);
return;
}
}A;
int main()
{
scanf("%d%s",&n,s+);
for(int i=;i<=n;++i)A.add(s[i]-'a',i);
A.sort();A.work();
return ;
}

CodeForces700E Cool Slogans的更多相关文章

  1. 题解-CodeForces700E Cool Slogans

    Problem 题目链接 题目大意:给定一个字符串,每次取出出现至少两次的子串替换原串,问最多能替换多少次,输出答案加一(字符串长为\(2×10^5\)) Solution 前置技能:SAM.线段树合 ...

  2. CF700E Cool Slogans

    CF700E Cool Slogans 题目描述 给出一个长度为n的字符串\(s[1]\),由小写字母组成.定义一个字符串序列\(s[1....k]\),满足性质:\(s[i]\)在\(s[i-1] ...

  3. 【CF700E】Cool Slogans 后缀自动机+线段树合并

    [CF700E]Cool Slogans 题意:给你一个字符串S,求一个最长的字符串序列$s_1,s_2,...,s_k$,满足$\forall s_i$是S的子串,且$s_i$在$s_{i-1}$里 ...

  4. CF 700 E. Cool Slogans

    E. Cool Slogans 链接 题意: 给定一个字符串S,从中选出k个子串a[1],a[2]...a[k],满足a[i]在a[i+1]中出现了两次(可以重叠),求最大的k. 分析: 建出SAM, ...

  5. 【CF700E】Cool Slogans(后缀自动机)

    [CF700E]Cool Slogans(后缀自动机) 题面 洛谷 CodeForces 题解 构建后缀自动机,求出后缀树 现在有个比较明显的\(dp\) 设\(f[i]\)表示从上而下到达当前点能够 ...

  6. [LOJ 6288]猫咪[CF 700E]Cool Slogans

    [LOJ 6288]猫咪[CF 700E]Cool Slogans 题意 给定一个字符串 \(T\), 求一个最大的 \(K\) 使得存在 \(S_1,S_2,\dots,S_k\) 满足 \(S_1 ...

  7. Codeforces 700E. Cool Slogans

    Description 给定一个串 \(S\),求一个序列 \(a_i\),满足 \(a_i\) 是原串的子串,且 \(a_i\) 在 \(a_{i-1}\) 中至少出现两次,求这个序列的最大的长度 ...

  8. CF700E E. Cool Slogans

    https://codeforces.com/contest/700/problem/E 题解:https://www.luogu.org/problemnew/solution/CF700E 其实就 ...

  9. Codeforces 700E. Cool Slogans 字符串,SAM,线段树合并,动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF700E.html 题解 首先建个SAM. 一个结论:对于parent树上任意一个点x,以及它所代表的子树内任 ...

随机推荐

  1. Spring整合Quartz定时任务 在集群、分布式系统中的应用(Mysql数据库环境)

    Spring整合Quartz定时任务 在集群.分布式系统中的应用(Mysql数据库环境)   转载:http://www.cnblogs.com/jiafuwei/p/6145280.html 单个Q ...

  2. css拾遗(一)(inline-block,absolute)

    一:inline-block中不要嵌套其他block标签,不然会破坏布局 <style> .left{ float:left; } .hide{ display:none; } a{ di ...

  3. SpringBoot Logback日志配置

    Logback的配置介绍: 1.Logger.appender及layout Logger作为日志的记录器,把它关联到应用的对应的context上后,主要用于存放日志对象,也可以定义日志类型.级别. ...

  4. POJ 3710 无向图简单环树上删边

    结论题,这题关键在于如何转换环,可以用tarjan求出连通分量后再进行标记,也可以DFS直接找到环后把点的SG值变掉就行了 /** @Date : 2017-10-23 19:47:47 * @Fil ...

  5. javascript 简单工厂模式

    var Bicycle = new Interface("Bicycle",["assemble","wash","ride&qu ...

  6. mysql统计一个字段的多种状态

    假如我有下面的表:ID    Item           status            updatetime    author1    a        1        2014-01-0 ...

  7. Linux中Nginx安装与配置详解

    转载自:http://www.linuxidc.com/Linux/2016-08/134110.htm Linux中Nginx安装与配置详解(CentOS-6.5:nginx-1.5.0). 1 N ...

  8. expect 交互 telnet 交互

    telnet 交互 #!/bin/bash Ip="10.0.1.53" a="\{\'method\'\:\'doLogin\'\,\'params\'\:\{\'uN ...

  9. E1. Array and Segments (Easy version)(暴力) && E2. Array and Segments (Hard version)(线段树维护)

    题目链接: E1:http://codeforces.com/contest/1108/problem/E1 E2:http://codeforces.com/contest/1108/problem ...

  10. VAE(Variational Autoencoder)的原理

    Kingma, Diederik P., and Max Welling. "Auto-encoding variational bayes." arXiv preprint ar ...