Problem

Codeforces

Solution

先建出后缀自动机,然后我们可以按照right集合来dp。不妨设f[x]表示为x节点表示的子串所能得到的最优答案。

那么有状态转移方程 f[u]=1+maxf[v] f [ u ] = 1 + max f [ v ] f[u]=1+\max f[v],当然了,v要满足在u中出现了至少两次。那么可以在parent树上做这样的一个事情,用top表示从节点到根的路径上最优的节点,即最近的一个转移的。为了判断,我们用线段树合并乱搞出一个right集合。当然由于是从parent树上自上而下继承的,那么至少会在pos[u]处出现过一次,那么我们就只需要查询是否出现第二次。则此时的这一个有效区间为 [pos[u]−len[u]+len[v],pos[u]−1] [ p o s [ u ] − l e n [ u ] + l e n [ v ] , p o s [ u ] − 1 ] [pos[u]-len[u]+len[v],pos[u]-1],如果有值则说明出现了第二次。

注意一下pos的转移,hhh我调这个调了40min

Code

#include <cstring>
#include <cstdio>
using namespace std;
const int maxn=400010,maxm=10000010;
int n,tot=1,lst=1,sz,ans=1,p[maxn],a[maxn],l[maxn],pre[maxn],ch[maxn][26];
int pos[maxn],top[maxn],f[maxn],rt[maxn],lc[maxm],rc[maxm];
char s[maxn>>1];
void update(int l,int r,int pos,int &rt)
{if(!rt) rt=++sz;if(l==r) return ;int m=(l+r)>>1;if(pos<=m) update(l,m,pos,lc[rt]);else update(m+1,r,pos,rc[rt]);
}
int query(int l,int r,int L,int R,int rt)
{if(!rt) return 0;if(L<=l&&r<=R) return 1;int m=(l+r)>>1;if(L<=m&&query(l,m,L,R,lc[rt])) return 1;if(m<R&&query(m+1,r,L,R,rc[rt])) return 1;return 0;
}
inline int merge(int x,int y)
{if(!x||!y) return x|y;int nw=++sz;lc[nw]=merge(lc[x],lc[y]);rc[nw]=merge(rc[x],rc[y]);return nw;
}
void insert(int c,int id)
{int p=lst,np=++tot;lst=np;l[np]=l[p]+1;pos[np]=id;for(;p&&!ch[p][c];p=pre[p]) ch[p][c]=np;if(!p) pre[np]=1;else{int q=ch[p][c];if(l[p]+1==l[q]) pre[np]=q;else{int nq=++tot;l[nq]=l[p]+1;pos[nq]=pos[q];memmove(ch[nq],ch[q],sizeof(ch[q]));pre[nq]=pre[q];pre[q]=pre[np]=nq;for(;ch[p][c]==q;p=pre[p]) ch[p][c]=nq;}}update(1,n,id,rt[lst]);
}
int main()
{#ifndef ONLINE_JUDGEfreopen("in.txt","r",stdin);#endifscanf("%d%s",&n,s+1);for(int i=1;i<=n;i++) insert(s[i]-'a',i);for(int i=1;i<=tot;i++) a[l[i]]++;for(int i=1;i<=n;i++) a[i]+=a[i-1];for(int i=tot;i;i--) p[a[l[i]]--]=i;for(int i=tot;i>1;i--) rt[pre[p[i]]]=merge(rt[pre[p[i]]],rt[p[i]]);for(int i=2;i<=tot;i++){int x=p[i],fa=pre[x];if(fa==1){f[x]=1;top[x]=x;continue;}if(query(1,n,pos[x]-l[x]+l[top[fa]],pos[x]-1,rt[top[fa]]))f[x]=f[fa]+1,top[x]=x;else f[x]=f[fa],top[x]=top[fa];if(ans<f[x]) ans=f[x];}printf("%d\n",ans);return 0;
}

Codeforces 700E Cool Slogans相关推荐

  1. Codeforces.700E.Cool Slogans(后缀自动机 线段树合并 DP)

    题目链接 \(Description\) 给定一个字符串\(s[1]\).一个字符串序列\(s[\ ]\)满足\(s[i]\)至少在\(s[i-1]\)中出现过两次(\(i\geq 2\)).求最大的 ...

  2. Codeforces 700E. Cool Slogans

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

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

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

  4. codeforces 700E

    题目链接 题意 给一个字符串S,要求构造字符串序列 s 1 , s 2 , . . . , s k s_1,s_2,...,s_k s1​,s2​,...,sk​,满足任意s都是S的子串,且任意i∈[ ...

  5. 【集训队作业】IOI 2020 集训队作业 试题泛做 13

    Codeforces 679E Bear and Bad Powers of 42 不难发现数列中的元素不可能达到很大,我们只需要考虑 424242 的前若干个幂. 考虑没有赋值操作的做法,则可用线段 ...

  6. CodeForces 375D Tree and Queries

    传送门:https://codeforces.com/problemset/problem/375/D 题意: 给你一颗有根树,树上每个节点都有其对应的颜色,有m次询问,每次问你以点v为父节点的子树内 ...

  7. 「日常训练」Bad Luck Island(Codeforces Round 301 Div.2 D)

    题意与分析(CodeForces 540D) 是一道概率dp题. 不过我没把它当dp做... 我就是凭着概率的直觉写的,还好这题不算难. 这题的重点在于考虑概率:他们喜相逢的概率是多少?考虑超几何分布 ...

  8. 【codeforces 812C】Sagheer and Nubian Market

    [题目链接]:http://codeforces.com/contest/812/problem/C [题意] 给你n个物品; 你可以选购k个物品;则 每个物品有一个基础价值; 然后还有一个附加价值; ...

  9. CodeForces 获得数据

    针对程序的输出可以看见 CodeForces :当输入.输出超过一定字符,会隐藏内容 所以:分若干个程序进行输入数据的获取 1. 1 for (i=1;i<=q;i++) 2 { 3 scanf ...

最新文章

  1. python完全新手教程-Python完全新手教程
  2. 数据结构——顺序存储二叉树
  3. Linux系统优化脚本
  4. word文本样式代码样式_使用文本样式表达创建真相来源
  5. Java反射机制概念及应用场景
  6. js初步简单的编程代码
  7. 【釜底抽薪】谷歌锁喉华为
  8. 实现对顺序表的入栈出栈操作、利用栈将十进制转化成二进制输出【数据结构实验报告】
  9. 初次接触NHibernate遇到的问题及解决方法
  10. Zabbix 神器——自动发现
  11. Android-基本控件和详解四种布局方式
  12. 让IIS7支持SSI功能(用来支持shtml)的方法
  13. ubuntu 终端透明
  14. 用matlab做数据挖掘,matlab实现数据挖掘
  15. 通过jclasslib修改class文件
  16. 51单片机仿真例程-八段数码管
  17. 如何删除github上的文件夹(抖机灵方法)
  18. Win7下装centos7
  19. noip2010引水入城-搜索+贪心
  20. GitHub 上这个「计算机科学」自学指南火了!

热门文章

  1. 1bit和1byte_bit和Byte有什么不同
  2. Educoder头歌--MySQL开发技巧 - 批量数据入库及检索
  3. 计算机组成原理实训报告(附电路图)
  4. 复兴标志着守望者彩带Fran和Aspen
  5. USBASP制作参考资料整理
  6. ARCGIS空间数据图层叠加分析
  7. 2013年固安房价必然爆跌的4个理由
  8. java ymodem协议,anroid ymodem 实现单片机固件升级
  9. 高新技术企业申报属于哪个部门?
  10. 2021,瑞幸咖啡“向新而生”