随笔分类 - 字符串
摘要:题目 题解 题目给了很重要的性质,就是保证询问的[l,r]是合法括号串(没有的话可能要莫队+二分找?) 假设给出的s串是合法括号序,按照树转括号序的方法逆向转成树,用左括号下标作为树上点的标号 例如 ()(()()) ,则有root-1, root-3, 3-4, 3-6,方法是维护左括号的栈,加入
阅读全文
摘要:记一下,待更
阅读全文
摘要:最小表示法 O(n)找到字典序最小的循环串 做法 先把串复制一遍,维护指针ij表示**[0,max(i,j)-1]中除min(i,j)均不合法**,再维护匹配了k位 (此时min(i,j)不一定合法,但这样的话min(i,j)一定会跳到和另一个交换为止,则另一个会变为新的min,这样就合法了) 直接
阅读全文
摘要:题目大意 题解 裸题 建SAM,在SAM上面数位dp维护位置和当前长度即可 注意要先枚举新加的数,然后统一跳fail直到可以往下接,否则时间不能保证 时间复杂度O(10*nd^2) code #include <bits/stdc++.h> #define fo(a,b,c) for (a=b; a
阅读全文
摘要:题目大意 题解 不难但是因为字符串太菜所以想了很久 排行榜上跑得快的一些做法假了,不知道有没有更简单的做法 结论:存在一种最优序列,使得Si是Si-1的后缀,证明把任意一种最优的不断删掉末尾将其顶住 也可以同时满足开头但是不需要,这样可以写个O(n^2)KMP暴力来拍 把SAM建出来,同一个点上的串
阅读全文
摘要:题目大意 给出一个串S,求将至多一个位置换成*后所有串的不同子串个数 |S|<=1e5 题解 比E阳间得多但是并不是很好写 开始想枚举开头然后考虑星号位置,然后发现不可做 换一种思路,从大到小枚举星号前面的长度,那么变成新的问题: 每次动态加入一个S的后缀,或者把两个后缀集合合并,不同集合的串一定不
阅读全文
摘要:题目描述 题解 并没有注意到相邻串字母不同,x=1想到用辅助数组加速跳next 首先显然离线,对每一段末尾求next,next的定义修改为匹配到的位置一定所在串的末尾 第一段长度大于等于,其他段长度刚好等于,把每一段当作特殊字符来做kmp,在找的时候算答案,答案是若干等差数列之和 由于kmp时间均摊
阅读全文
摘要:题目描述 n<=5e5,w<=1e18,T=5 题解 需要各种前置姿势的吼题 同余最短路 求形如的A的个数 做法是按找%min(a)变成min(a)*x+b来分类跑最短路,f[i]表示%min(a)=i的最小的b,最后直接统计 本题中可
阅读全文
摘要:注意事项 初始有两个根01,分别对应奇偶,长度为0/-1,0的fail是1 如果跳到了1号点,那么新建的点的fail是0 种数=点数-1,某个串结尾的回文子串个数=fail链长度 扩展要考虑匹配以及边界 code 洛谷5496 #include <bits/stdc++.h> #define fo(
阅读全文
摘要:题目描述 题解 答案=f[i],大于等于是因为可以通过删减变成f[i] 1 假设判断是O(log),这样做是log\^2 发现f[i+1] =f[i] 1,即至少为i删掉一个字符,因此有f[i]=|S|就是 还有这道题并不需要考虑一个节点对应的多个串之间的关系,因为丢进去的是整个后缀,是主链上的点上
阅读全文
摘要:3828 给定n个点的坐标(0f[i+1]+2,那么把i时的B删掉头尾的长度必然 f[i+1] 从后往前枚举,每次从f[i+1]+2往下枚举f[i],hash判断
阅读全文