感谢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. Codeforces 923 D. Picking Strings

    http://codeforces.com/contest/923/problem/D 题意: A-->BC , B-->AC , C-->AB , AAA-->empty 问 ...

  2. Codeforces 923 B. Producing Snow

    http://codeforces.com/contest/923/problem/B 题意: 有n天,每天产生一堆体积为Vi的雪,每天所有雪堆体积减少Ti 当某一堆剩余体积vi<=Ti时,体积 ...

  3. Codeforces 932 E. Team Work(组合数学)

    http://codeforces.com/contest/932/problem/E 题意:   可以看做 有n种小球,每种小球有无限个,先从中选出x种,再在这x种小球中任选k个小球的方案数 选出的 ...

  4. bzoj千题计划207:bzoj1879: [Sdoi2009]Bill的挑战

    http://www.lydsy.com/JudgeOnline/problem.php?id=1879 f[i][j] 表示匹配了i个字符,匹配字符串的状态为j的方案数 枚举下一个字符是什么 计算加 ...

  5. ARC 之内存转换

    CHENYILONG Blog ARC 之内存转换 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilo ...

  6. Python实现网页截图(PyQT5)

    方案说明 功能要求:实现网页加载后将页面截取成长图片涉及模块:PyQT5 PIL逻辑说明: 1:完成窗口设置,利用PyQT5 QWebEngineView加载网页地址,待网页加载完成后,调用check ...

  7. C. Ayoub and Lost Array(DP)

    (又是被队友带着上分的一场--) 题目链接:http://codeforces.com/contest/1105/problem/C 题目大意:给你n,l,r.每一个数都是在l,r范围之内,然后问你这 ...

  8. Useful Online Resources for New Hackers

    出处:https://www.hackerone.com/blog/resources-for-new-hackers HackerOne喜欢花时间与活跃的黑客和有兴趣学习如何破解的人交谈. 就在上周 ...

  9. find中的-print0和xargs中-0的奥妙【转】

    find cygnus/firmware_cygnus/target/linux/brcm5830/files/arch/arm/mach-iproc/pm_iproc/ -name "*. ...

  10. C++的那些事 1

    最近在看c++的一些库文件,里面的一些比较陌生但看起来挺有用的一些东西,在此记下,以免日后看到再翻找资料. template <size_t _Nb> 这是在看bitset的时候看到的,之 ...