CodeForces700E Cool Slogans
感谢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的更多相关文章
- 题解-CodeForces700E Cool Slogans
Problem 题目链接 题目大意:给定一个字符串,每次取出出现至少两次的子串替换原串,问最多能替换多少次,输出答案加一(字符串长为\(2×10^5\)) Solution 前置技能:SAM.线段树合 ...
- CF700E Cool Slogans
CF700E Cool Slogans 题目描述 给出一个长度为n的字符串\(s[1]\),由小写字母组成.定义一个字符串序列\(s[1....k]\),满足性质:\(s[i]\)在\(s[i-1] ...
- 【CF700E】Cool Slogans 后缀自动机+线段树合并
[CF700E]Cool Slogans 题意:给你一个字符串S,求一个最长的字符串序列$s_1,s_2,...,s_k$,满足$\forall s_i$是S的子串,且$s_i$在$s_{i-1}$里 ...
- CF 700 E. Cool Slogans
E. Cool Slogans 链接 题意: 给定一个字符串S,从中选出k个子串a[1],a[2]...a[k],满足a[i]在a[i+1]中出现了两次(可以重叠),求最大的k. 分析: 建出SAM, ...
- 【CF700E】Cool Slogans(后缀自动机)
[CF700E]Cool Slogans(后缀自动机) 题面 洛谷 CodeForces 题解 构建后缀自动机,求出后缀树 现在有个比较明显的\(dp\) 设\(f[i]\)表示从上而下到达当前点能够 ...
- [LOJ 6288]猫咪[CF 700E]Cool Slogans
[LOJ 6288]猫咪[CF 700E]Cool Slogans 题意 给定一个字符串 \(T\), 求一个最大的 \(K\) 使得存在 \(S_1,S_2,\dots,S_k\) 满足 \(S_1 ...
- Codeforces 700E. Cool Slogans
Description 给定一个串 \(S\),求一个序列 \(a_i\),满足 \(a_i\) 是原串的子串,且 \(a_i\) 在 \(a_{i-1}\) 中至少出现两次,求这个序列的最大的长度 ...
- CF700E E. Cool Slogans
https://codeforces.com/contest/700/problem/E 题解:https://www.luogu.org/problemnew/solution/CF700E 其实就 ...
- Codeforces 700E. Cool Slogans 字符串,SAM,线段树合并,动态规划
原文链接https://www.cnblogs.com/zhouzhendong/p/CF700E.html 题解 首先建个SAM. 一个结论:对于parent树上任意一个点x,以及它所代表的子树内任 ...
随机推荐
- Maven的国内镜像(解决jar下载过慢)
Maven简介 maven作为一个项目管理工具确实非常好用,结果在使用时候,你会发现下载jar速度不如自己在网上下载.之前oschina的中央仓库可用,现在oschina的maven服务器关了,只能拿 ...
- ifconfig不显示网卡eth0
参考资料:http://blog.itpub.net/25851087/viewspace-1700568/ 在/etc/sysconfig/network-script/ifcfg-eth0网卡配置 ...
- Nginx 服务器性能Bug和性能优化方案(真实经历)
一.遇到的问题 1.问题:本应该是3个ffmpeg ,但是怎么会有5个ffmpeg出现? 2.Lua脚本问题,一直写入日志,导致有大量的日志,这里的错误日志是直接写进nginx的error.log 日 ...
- J2EE的体系结构是指什么?
J2EE 即Java2平台企业版,它提供了基于组件的方式来设计.开发.组装和部署企业应用.J2EE使用多层分布式的应用模型,这个多层通常通过三层或四层来实现: 客户层,运行在客户计算机上的组件. We ...
- Python 入门基础2 --基本数据类型、运算符
本节目录 一.IDE(集成环境的安装) 二.基本数据类型 三.输入输出 四.运算符 五.后期补充内容 一.IDE(集成环境的安装) 安装pycharm 注:快捷键: 1.ctrl + ? :注释此行, ...
- [Alg::Trick]小白鼠找毒酒
题目来源:牛客网 https://www.nowcoder.com/questionTerminal/c26c4e43c77440ee9497b20118871bf1 8瓶酒一瓶有毒,用人测试.每次测 ...
- Maven部署dao工程到私服上——(十三)
1.修改settings.xml 需要在客户端即(部署dao工程)的电脑上配置 maven环境,并修改 settings.xml 文件,配置连接私服的用户和密码 . 此用户名和密码用于私服校验,因为私 ...
- linux中serial driver理解【转】
转自:http://blog.csdn.net/laoliu_lcl/article/details/39967225 英文文档地址:myandroid/kernel_imx/Documentatio ...
- nginx_upstream_check_module监控后端服务器http
nginx_upstream_check_module 是专门提供负载均衡器内节点的健康检查的外部模块,由淘宝的姚伟斌大神开发,通过它可以用来检测后端 realserver 的健康状态.如果后端 re ...
- Windows安装pycrypto失败记录
Windows 10家庭中文版,Python 3.6.4, 180824测试前端加密文本在后台揭秘,查询后发现,可以使用pycrypto模块实现,那么,安装它(pip),结果安装失败了. 本文暂时记录 ...