首页 > 其他分享 >[NOI2018] 你的名字

[NOI2018] 你的名字

时间:2023-06-11 09:22:22浏览次数:46  
标签:子串 前缀 sum 节点 名字 自动机 NOI2018 我们

给定串 \(S,T_{1,\cdots,q}\),每次询问是 \(S[l_i,r_i]\) 的子串但不是 \(T_i\) 的子串的本质不同子串个数。

\(|S|\le5e5,q\le1e5,\sum|T|\le1e6\)。

我们先考虑 \(l=1,r=|S|\) 怎么做。

显然我们使用 SAM 可以简单计算出 \(T_i\) 的本质不同子串数,那么我们肯定想算出来 \(S\) 和 \(T_i\) 的公共子串个数。

我们当然可以把 \(S,T_i\) 拼起来跑 SAM,但是我们想要一个 \(O(\sum T_i)\) 的做法。

可以考虑对 \(T_i\) 的每一个本质不同子串我们都算出来它是否是 \(S\) 的子串,对 \(T_i\) 的每个自动机节点而言,这都是一个前缀,我们只需要算出这个界就可以。而这个界可以通过算出该自动机节点任一 endpos 位置对应的前缀所能匹配上 \(S\) 的最大长度计算出。这个可以在 \(S\) 的自动机上“匹配” \(T_i\) 做到。

现在已经有 \(68\) 分力!

我们考虑加上 \(l,r\) 的限制。我们只需要算出 \(T_i\) 每个前缀能匹配上 \(S[l,r]\) 的最大长度。考虑我们之前的“匹配”过程是怎样的:我们先尝试在最后加入字符 \(T_{i,j}\),如果加不进去,就不停在前端删除字符(跳 parent 树),直到可加入或跳出为止。

我们发现只需要快速判断能否加入字符 \(T_{i,j}\),上面的过程是可以照搬的。

现在考虑手头有一个子串 \(S'\),告诉你对应的 \(S\) 上自动机节点,你要判断它是否在 \([l,r]\) 内。

这个就简单多了!我们只需要知道这个节点内是否存在一个 endpos \(p\),满足 \(l-|S'|+1\le p\le r\) 即可。

这长得是个二维问题,但我们把询问按 \(r\) 排序,维护 \(p\) 的最大值,每次询问 \([dfnl_x,dfnr_x]\) 内的最大值判断是否 \(\ge l-|S'|+1\) 即可。

总复杂度 \(O(|S|+\sum|T|\log |S|)\)。

标签:子串,前缀,sum,节点,名字,自动机,NOI2018,我们
From: https://www.cnblogs.com/PYD1/p/17472495.html

相关文章

  • 30万个名字汉字起名中文取名ACCESS\EXCEL数据库
    虽然汉字#起名名字#的数据库已经有一些,比如7千多汉字起名参考大典ACCESS数据库、汉字起名中文起名宝宝起名ACCESS数据库,但是今天发现了一个数据库,他是在《7千多汉字起名参考大典》的基础上增加了30万个男孩女孩的名字实例。非常适合于比如固定了名字的第二个字,取第三个字时一查就......
  • 24万个取名名字五行名字ACCESS\EXCEL数据库
    虽然之前弄到过一个《30万个名字汉字起名中文取名ACCESS数据库》数据库,但是有一些小缺点,比如没有单名,比如没有五行属性,而今天弄到的这份就包括,看截图:字数统计:名字单字的包含7088条,2个字的包含234337条;金属性名字有60697条,木属性名字有112682条,水属性名字有100979条,火属性名字有......
  • 序列化Java对象重命名字段,@JSONField、@JsonProperty、@SerializedName
    @JSONField主要用于返回出参转换这个注解分别可以注解在实体类的属性、setter和getter方法上publicclassTest{/*注解在属性上的时候可以设置一些序列化、格式化的属性@JSONField(serialize=false)---->序列化的时候忽略这个属性@JSO......
  • 【cplusplus教程翻译】名字可见性(Name visibility)
    作用域(Scopes)命名实体,如变量、函数和复合类型,在C++中使用之前需要声明。程序中发生此声明的点会影响其可见性:在任何块外部声明的实体都具有全局作用域,这意味着其名称在代码中的任何位置都是有效的。而在块内声明的实体,如函数或选择性语句,具有块作用域,并且只能在声明它的特定块内......
  • 传统蓝牙获取对方名字
    1.如果对方注册了EIR,并且EIR中有CompleteLocalName,那么就可以通过inquiryresult拿到2.如果对方没有注册EIR,即使注册了EIR当没有CompleteLocalName;同时本地端用的是standardinquiry或RSSIinquiry那么就需要本地端下一个HCI_Remote_Name_Request命令来获取对端的名字,然......
  • [NOI2018] 归程 解题报告
    题面步行的最小距离很容易求,dij随便求一下每个点的最短路,然后找到与\(v\)能相互坐车到达的点,对这些点的最短路都有可能是答案,取个\(\min\)即可。所以本题最大的问题是怎么找到在水位线为\(p\)时,与\(v\)能相互坐车到达的点。可以想到只保留海拔大于\(p\)的边,因为只要考......
  • Java名字的由来
       Java语言的历程丰富多彩,被现在众多程序员和企业广泛使用,不用质疑这是Java的领先技术的结果。   Java是Sun公司开发的一种编程语言,Sun公司最初的方向是让Java来开发一些电器装置程序,如:机顶盒、公交卡,Sun公司万万没想到Java会引来这么多的企业关注,所以又继续往网络编......
  • 名字修饰约定: extern "C"、extern "C++" 和__stdcall、__cdecl相关的约定、__imp_前
    关于extern_C通常,在C语言的头文件中经常可以看到类似下面这种形式的代码#ifdef__cplusplusextern"C"{#endif/****somedeclarationorso*****/#ifdef__cplusplus}#endif/*endof__cplusplus*/那么,这种写法什么用呢?实际上,这是为了让CPP能够与C......
  • odoo中 py3o的打印报告中,报告的名字如果要取当天的日期或其它日期时,如果要导包,import
    odoo中py3o的打印报告中,报告的名字如果要取当天的日期或其它日期时,如果要导包,import timedate.这种在report的名字中,是请允许使用eval 这个函数(出于安全考虑)可以使用下面的来替代时间'orderrecap%s'%(time.strftime("%Y-%m-%d",time.localtime())) 还有一种方法是......
  • [Ynoi2018] 天降之物
    [Ynoi2018]天降之物这个根号分治太神啦。首先考虑一个朴素的暴力:对每个数维护出现位置的std::vector这样查询可以两个指针遍历std::vector做到平方复杂度。注意到复杂度和出现次数有关,那么就可以考虑阈值分治了,然而合并的操作使得我们不好维护信息。先考虑不带修的情况,对......