「刷题」你的名字

题真好。
也帮我回忆起了快两个月没动的\(SAM\)。
我只能想到\(68\)分的数据。
题目要求给出一个串\(S\)。
然后每次询问给出一个串\(T\)和两个变量\(l,r\)
要求出有多少个本质不同串是\(T\)的子串而不是\(S[l,r]\)的子串。
前面\(68\)分是\(l=1,r=n\)的。
直接做。
首先我们对\(S\)建出后缀自动机。
询问的时候,对\(T\)再次建出后缀自动机。
每次建出一个前缀节点的时候统计一下本质不同子串,同时记录此时前缀节点父亲的\(len\)值,如果是第\(i\)个前缀节点,那么这个值称作\(t[i]\)。
这样就简单了。
我们在\(S\)的\(SAM\)上跑\(T\)。
每次跑到某一个节点的时候就判断一下当前的匹配长度\(len\)是否大于当前的\(t[i]\)值。
这样用\(T\)本质不同子串减去\(len-t[i]\),表示当前匹配到的长度所被包含的最长后缀中含有的可以匹配上的本质不同子串的个数。
这样就得到答案了。

剩下的32分想不到了。

正解是用线段树合并去做。
我们首先建出\(S\)的\(SAM\)。
这样用线段树合并求出\(endpos\)集合。
同样在\(S\)上跑\(T\)。
这次判断条件改一下。
能否匹配的条件是转移过去的节点的\(endpos\)集合和\([L+len,R]\)有交。
注意此时失配不能直接跳虚树父亲节点,而应当减小\(len\)在试一次。
这样用二分即可,复杂度多出一个\(log\)。(10^6俩\(log\)都能卡过\(hhh\))
同样做法减去\(len-t[i]\)就可以了。

原文地址:https://www.cnblogs.com/Lrefrain/p/12050152.html

时间: 2024-08-07 18:02:42

「刷题」你的名字的相关文章

「C语言」「刷题」XUPT Online Judge经典题型

在学校OJ网( http://www.xyjudge.com/)上刷了一些题,有的题型值得整理在博客上. 3.6日才刚刚开始刷,慢慢添加那些比较经典的,并尽量用多种方法求解后思考哪一种最适合. 1 #include <stdio.h> 2 #include <math.h> 3 #define A 2 4 5 int f(int i,int k) 6 { 7 int j; 8 j=k*A*pow(10,i); 9 return j; 10 } 11 12 int main() 13

「刷题」JZPKIL

这道反演题,真牛逼. 以下用$B$代表伯努利数,$l*g=f$代表狄利克雷卷积,先推式子. 对于给出的$n,x,y$求一百组数据的$ans$ $\begin{array}{rcl} ans & = & \sum\limits_{i=1}^ngcd(i,n)^xlcm(i,n)^y\end{array}$ $\begin{array}{rcl} & = & \sum\limits_{i=1}^ngcd(i,n)^x\frac{(in)^y}{gcd(i,n)^y}\end{a

「刷题」Triple

正解是指数型母函数+FFT. 才学了多项式,做了一道比较好的题了. 首先有三个斧子被偷了. 我们考虑构造一种指数型母函数. 就是说一种多项式吧,我的理解. 系数是方案,下标,也就是所谓的元指数代表的是价值. 这样如果两个母函数相乘的话,指数相加,系数相乘. 正好就是两个单元合并之后的方案和价值. $A(x),B(x),C(x)$分别代表一把相同的斧子用价值为x,2把为x,3把为x的方案数. 容斥一下. 三把的答案就是$A(x)*A(x)*A(x)-C_3^1A(x)B(x)+2C(x)$ 解释一

「刷题」 网络

看了一下网上基本都是线段树二分的题解,然而我想到一种整体二分的思路,正好练习一下. 是道好题. 首先用树上ST表处理,用于求LCA. 考虑整体二分离线求解. 一种方法是用树链剖分的,复杂度是$O(log^2n)$的,在套上个整体二分,复杂度达到了$O(nlog^3n)$所以说不可以直接树剖暴力. 可以用树上差分的方式. 考虑假设对于当前询问二分出的某一个答案,如何$check$? 只需要判断这个点是否阻断了所有的权值大于这个答案的路径,如果是的话,那么放低上界,否则升高下界. 用整体二分来做这个

「刷题」Color 群论

这道题乍一看挺水的,直接$ Ploya $就可以了,可是再看看数据范围: $ n\lep 1e9 $ 那就是有1e9种置换,这不歇比了. 于是考虑式子的优化. 首先证明,转i次的置换的每个循环结大小是 $ gcd(i,n) $ 证明: 首先设第x个元素的位置是p,置换种类是i,循环k次后回到原点,k也就是循环结个数. $ ik+p \equiv p (mod n) $ $ ik \equiv 0 (mod n) $ $ n|ik $ $ i|ik $ 我们要让k最小,那么: $ ik=lcm(i

「刷题」GERALD07加强版

是LCT了. 首先我们不知道联通块怎么数. 然后颓标签知道了是LCT. 那么考虑一下怎么LCT搞. 有一个很普遍的思路大家也应该都知道,就是如何求一个区间中某种颜色的个数. 这个可以很简单的用主席树来实现对吧,只需要记录下来这种颜色上次出现的位置就可以了,然后在$[l,r]$中查询值在$[0,l-1]$中的数的个数. 然后联通块和这个有什么关系呢? 颜色的话为什么可以用这种方法代替呢?为了去重,而这道题中什么情况是所谓“重”的呢? 就是两条边链接了两个相同的集合的时候. 那么考虑以下一种算法.

「原创题」红太阳

「题目描述」 我们都知道,红太阳会发出光芒.每天红太阳会等概率随机.不超过 $n$ 次地发出光芒,每次包含着 $a$ 个单位的热量. 我们都知道,只有在红太阳的照耀下,我们才能茁壮成长.每天每个人都希望得到 $c$ 个单位的热量,只有得到了 $c$ 个单位的热量,一个人才会满足,并高呼「红太阳万岁!」.而红太阳会满足尽量多的人. 问每天红太阳能满足的人的期望个数,为了避免浮点误差,将答案乘上 $n+1$ 对 ${10} ^ 9 + 7$ 取模后输出. 「做法1」类欧几里得算法 求 $\begin

路灯「APIO 2019」

题意 有.复杂,自己上网搜 思路 \((x,y)\) 表示从\(x\)到\(y\)联通的时间长度. 那么查询操作相当于二维平面上的单点查询. 对于每一个\(i\),维护一个最左能到达的\(lm\),和最右能到达的\(rm\). 那么对于每一个更新操作,相当于对左上角为\((lm,i)\),右下角为\((i,rm)\)的矩形做修改. 于是就转换为类似「简单题」的题目了,可以CDQ分治解决,当然也可以直接上树套树. 代码 #include <bits/stdc++.h> using namespa

LibreOJ #6001. 「网络流 24 题」太空飞行计划 最大权闭合图

#6001. 「网络流 24 题」太空飞行计划 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合 E={E1,E2,?,Em} E = \{ E_1, E_2, \cdots, E_m \}E={E?1??,E?2??,?,E?m??},和进行这些实验