这个D1T2绝对有毒。。。

首先我们构造一把反串的后缀自动机。

然后我们就需要找到每一个子串在SAM上的节点。

这个可以通过扫描线+树上倍增处理。

首先我们把所有的子串按照左端点排序,

然后从右往左扫描,在扫到\(i\)的时候:

我们取到\([i,n]\)的子串代表的节点,

那么所有的\([i,j]\)的子串都是这个节点在反串中的后缀!

所以所有的\([i,j]\)的子串对应的节点都是\([i,n]\)在\(parent\)树上的祖先。

那么就可以记\(f[i][j]\)为从\(i\)向上走\(2^j\)次\(suffix\) \(link\)得到的节点。

然后倍增出每一个\([i,j]\)的子串对应的节点就好了。

但这样会导致一些不同的子串对应到了同一个节点\(i\),

我们假设\(i\)表示的子串们存在\(v_i\)中。

那么我们考虑构图。

首先我们把所有\(v_i\)按照长度从小到大排序,小的就是大的前缀

(根据后缀自动机节点的定义,以及构的是反串的SAM)

那么我们就可以把所有的B类向后面的所有A类连边。

但是这样的边数就是平方级的,所以要改一下:

所有的B类向下一个B类连边,以及向所有的下一个B类之前的A类连边。

还需要为每一个SAM上的节点向所有第一个B类之前的A类连边。

这样就可以做到同一个SAM上的节点内的前缀关系。

那么看不同节点的前缀关系怎么求。

这样就可以很自然地想到\(suffix\) \(link\)。

把所有节点表示的最后一个B类向所有\(link\)指向它的节点连边。

因为这样可以从所有节点的所有B类走到另外所有节点的A类。

那么最后把控制关系连下边就可以直接\(dag\)上\(dp\)了。

如果存在环则答案必须是\(-1\)。因为环必须是包含A类串的。

dxm

把每个SAM上的节点拆成\(in_i\)和\(out_i\)两个,

然后从\(in\)到\(out\)连边,

并且从\(out\)向所有\(link\)指向它的\(in\)连边。

我们现在考虑怎么把节点内部的A和B处理好。

我们肯定要从所有的B连向所有的A,而不能从A跑到另一个能计入答案的A,

所以我们把A分成\(in\)和\(out\),

只有\(out\)是计入答案的,

那么我们对于同一个SAM上的节点这样连边:

  • 从每个A的\(in\)连到\(out\),并从\(out\)向所有支配的B连边。
  • 从每个B,向长度大于等于它的第一个A的\(in\)连边,还要向该节点的\(out\)连边(要不然出不去
  • 从这个节点的\(in\)向所有的A的\(out\)连边。

这样想十分的自然。

xyx

首先通过SAM上倍增求出每个子串的节点,

然后看怎么建图:

首先我们把每个SAM中的节点的\(link\)连到自己,

并且按照长度把这个节点对应的所有的子串排序,

每个B连向下一个B,同时连向所有下一个B之前的A。

再把每个A连向所有支配的B即可。

再跑个dp就行了。

wyj

类似xyx,

但是他是把同一个SAM上节点的A串和B串分开考虑了,

导致需要对于每一个B串二分出长度大于等于它的第一个A。

复杂度就多了一个\(log\)。

hhr

类似xyx。(一模一样?

csl

首先构造SA。然后我们把每一个A串拎出来,

构建一棵树,其包含了所有的子串,并且如果\(u\)到\(v\)有一条边,则要满足\(u\)是\(v\)的前缀。

但这棵树的节点数太多了,我们只需要包含A的,就引出了新的概念——虚树。

(吐槽:这玩意折腾死我了。。。

所谓虚树,是在树上找一个不连通的块,使得:

其包含所有的A串和所有A串两两的LCA们。

这就要求我们在线性时间内求出A串两两的LCA。

注意到两串的LCA就是他们的LCP,那么我们这样做:

先把所有的A串按照字典序排(其实就是按照他们在原树上的\(dfn\)

然后把连续两个A串的LCP加进去也作为A串

这个是一个结论一样的东西???可能就是最后用到的LCA们最多就是这里的吧。(删掉

emmm其实这\(^{TM}\)就是虚树的基本操作啊。。。

再用单调栈存现在的“有用”的点,

扫一遍排序过后的A串,每次一直弹栈直到栈顶是当前节点的祖先(当前节点的前缀

那么就可以确定连这条边。

Ah...怎么这么难啊

再把所有的B连到自己所属的节点就好辣

yjz

首先构造SA,然后每一个子串可以用\([l,r]\)来一一表示,代表这个子串在排名\([l,r]\)的前缀中出现。

这样就可以按照字典序把A串都排好(所属后缀的\(rank\),长度)

那么B串是其前缀的A串们肯定是连续的。

感性理解一下:假设连续两个A串有一个\(lcp\),那一段A串的\(lcp\)就是中间两两的\(lcp\)的\(min\)。

所以假如现在我们的某个B串是\(A_i\)的前缀,那么

那么我们就要从B串的一个点连向A串的一个区间

所以线段树优化建图(orz​

再跑个\(dp\)就。。行了???

总结一下这题就是各种奇怪操作优化建图???

【LOJ 3049】「十二省联考 2019」字符串问题的更多相关文章

  1. LOJ #3049. 「十二省联考 2019」字符串问题

    LOJ #3049. 「十二省联考 2019」字符串问题 https://loj.ac/problem/3049 题意:给你\(na\)个\(A\)类串,\(nb\)个\(B\)类串,\(m\)组支配 ...

  2. 「十二省联考 2019」字符串问题——SAM+DAG

    题目 [题目描述] Yazid 和 Tiffany 喜欢字符串问题.在这里,我们将给你介绍一些关于字符串的基本概念. 对于一个字符串 $S$, 我们定义 $\lvert S\rvert$ 表示 $S$ ...

  3. LOJ 3049: 洛谷 P5284: 「十二省联考 2019」字符串问题

    题目传送门:LOJ #3049. 题意简述: 给定一个长度为 \(n\) 的母串 \(S\). 有 \(n_a\) 个 A 类串,都是 \(S\) 的子串,以区间的形式给出. 有 \(n_b\) 个 ...

  4. LOJ#3048. 「十二省联考 2019」异或粽子 Trie

    原文链接www.cnblogs.com/zhouzhendong/p/LOJ3048.html 题解 $O(n\log^2 {a_i})$ 的做法比较简单: 1. 求出第 k 大的是什么: 二分答案, ...

  5. LOJ#3052. 「十二省联考 2019」春节十二响(启发式合并)

    题面 传送门 题解 先考虑一条链的情况,对于\(1\)号点来说,肯定是左子树中最大值和右子树中最大值一组,左子树中次大值和右子树中次大值一组--以此类推 那么如果不是一条链呢?我们把所有的链合并起来就 ...

  6. LOJ#3048. 「十二省联考 2019」异或粽子(trie树+堆)

    题面 传送门 题解 我们先把它给前缀异或和一下,然后就是要求前\(k\)大的\(a_i\oplus a_j\).把\(k\)乘上个\(2\),变成前\(2k\)大的\(a_i\oplus a_j\), ...

  7. 【LOJ】#3051. 「十二省联考 2019」皮配

    LOJ#3051. 「十二省联考 2019」皮配 当时我在考场上觉得这题很不可做... 当然,出了考场后再做,我还是没发现学校和城市是可以分开的,导致我还是不会 事实上,若一个城市投靠了某个阵营,学校 ...

  8. 「ZJOI2019」&「十二省联考 2019」题解索引

    「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 20 ...

  9. 「十二省联考 2019」皮配——dp

    题目 [题目描述] #### 题目背景一年一度的综艺节目<中国好码农>又开始了.本季度,好码农由 Yazid.Zayid.小 R.大 R 四位梦想导师坐镇,他们都将组建自己的梦想战队,并率 ...

随机推荐

  1. 洛谷P4589 [TJOI2018]智力竞赛(二分答案 二分图匹配)

    题意 题目链接 给出一个带权有向图,选出n + 1n+1条链,问能否全部点覆盖,如果不能,问不能覆盖的点权最小值最大是多少 Sol TJOI怎么净出板子题 二分答案之后直接二分图匹配check一下. ...

  2. application.properties多环境配置文件、jar包外部配置文件、配置项加密、程序中配置使用

    一.简介 spring boot项目application.properties文件存放及使用介绍 二.方法一多环境配置文件 我们一般都会有多个应用环境,开发环境.测试环境.生产环境,各个环境的配置会 ...

  3. Spring整合ActiveMq消息队列

    ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久 ...

  4. chrome正确的打开方式

    1:修改默认的搜索引擎 原因是中国不能使用Google浏览器,所以需要对其默认的搜索引擎进行改造:   三个点/设置/修改默认搜索引擎     2:使用插件;   右上角的省略号小点/更多工具/扩展应 ...

  5. canvas学习总结四:绘制虚线

    上一章节我们说到,线性路径的绘制,主要利用movoTo(),lineTo()等方法,当然 Canvas 2D API 也提供了虚线的绘制方法,CanvasRenderingContext2D.setL ...

  6. 前端 CSS预处理器Less

    引文 Less是一种动态的样式语言.Less扩展了CSS的动态行为,比如说,设置变量(Variables).混合书写模式(Mixins).操作(Operations)和功能(Functions)等等, ...

  7. MyBatis笔记----(2017年)最新的报错:Cannot find class [org.apache.commons.dbcp.BasicDataSource] for bean with name 'dataSource' defined in class path resource [com/ij34/mybatis/applicationContext.xml]; nested e

    四月 05, 2017 4:56:11 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRef ...

  8. [20181225]12CR2 SQL Plan Directives.txt

    [20181225]12CR2 SQL Plan Directives.txt --//12C引入SQL PLAN Directives.12cR1版本会造成大量的动态取样,影响性能.许多人把OPTI ...

  9. shell编程-输入/输出重定向(十一)

    linux中文件描述符 linux跟踪打开文件,而分配的一个数字,通过这个数字可以实现对文件的读写操作 用户可以自定义文件描述符范围是:3-max,max跟用户的ulimit –n 定义数字有关系,不 ...

  10. 四、Tableau如何设置数据格式

    一.要求 ‘销售额’:K为单位 ‘利润’:        M为单位,负值用括号括起来,但是正值 ‘利润率’:带百分号,负值用括号括起来仍然时负值 二.解决方案 1.‘销售额’:m为单位 2.‘利润’: ...