首页 > 其他分享 >字符串合集

字符串合集

时间:2024-12-02 21:12:03浏览次数:6  
标签:LCP 后缀 leq cdots 字符串 树上 合集

Problem A. P7409 SvT

题意:

给定一个长度为 \(n\) 的小写英文字符串 \(s\) 和 \(q\) 次询问。每次给一个大小为 \(k_i\) 的整数集合,询问集合内两两不同数代表的后缀的 LCP 的长度和,对大质数取模。

\(1 \leq n \leq 5 \times 10^5\),\(1 \leq \sum k_i \leq 3 \times 10^6\),时限 \(3\) 秒,空间限制 \(512\) MB。

解法:

刻画后缀 LCP 的常见做法有很多。

一个做法是,考虑后缀排序,根据 SA 相关结论,两个后缀的 LCP 等价于区间 \(\min\)。询问时先进行相邻的 RMQ,然后单调栈求值即可。

另一方面,仍然考虑 SA,但是将区间 \(\min\) 刻画为笛卡尔树上 LCA 点权,显然对询问点建虚树即可。

不用 SA,直接考虑后缀树。容易发现后缀 LCP 等于后缀树上 LCA 到根路径长,进一步等于反串 SAM 的 Link 树上 LCA 的等价类最大长度。所以同样对询问点建虚树即可。

Submission Link.

Problem B. CF1090J Two Prefixes

题意:

给定字符串 \(s,t\),求 \(s\) 非空前缀与 \(t\) 非空前缀拼接后得到的本质不同字符串个数。

\(1 \leq |s|,|t| \leq 10^5\),字符集为小写英文字母。

解法:

假设 \(n = |s|\),\(m = |t|\)。

考虑对于每个本质不同字符串,在最小的 \(s\) 的前缀位置统计答案。

不难发现对于每个 \(i\),有且仅有一段后缀 \([j,m]\) 符合 \(s[1 \cdots i]+t[1 \cdots j]\) 是之前没有出现过的。我们考虑二分这个 \(j\),问题变为给定 \(i,j\),判断是否存在 \(x < i\) 使得 \(s[1 \cdots x]+t[1\cdots i+j-x]=s[1 \cdots i]+t[1 \cdots j]\)。容易发现本质相当于我们找到 \(s[1 \cdots i]\) 的某个后缀,其与 \(t\) 的某个前缀相等,然后把 \(t[1 \cdots j]\) 往后平移相同。

将 \(t\) 与 \(s\) 拼在一起,中间加个特殊符号。那么我们要找的后缀其实就是 Fail 树上的祖先。但是如果我们选了 \(s[1 \cdots i]\) 的一段长度为 \(k\) 的后缀,还需要判断 \(t[1 \cdots j]=t[k+1\cdots k+j]\) 是否成立。注意到这等价于 \(\operatorname{LCP}(t,t[k+1\cdots m]) \geq j\) 是否成立。于是先对 \(t\) 做一下 exKMP,然后在树上预处理每个点到根的点权最大值即可做到 \(O(1)\) 判定。

实际实现中不需要显式建树。

Submission Link.

标签:LCP,后缀,leq,cdots,字符串,树上,合集
From: https://www.cnblogs.com/happybob/p/18582729

相关文章

  • 【windows工作合集】 远程连接出现问题记录
    问题记录:由于需求要登录本地windows的虚拟机但是在输入用户信息/密码都正确的情况下出现上面截图的问题于是就百度进行查阅解决--主要就是说我这边机器可能是因为系统更新或者一些注册表的问题导致信息对不上,所以被认为无法登录(系统更新。微软系统补丁的更新将CredSSP身份......
  • 牛客【“华为杯” 2024年广东工业大学新生赛(同步赛)】F-字符串缩写太多了!
    输入3aaaaabbba输出15输入5yanamiannaa输出325备注:对于样例:缩写a的方案有2种:aaa、aab。缩写b的方案有1种:bba。缩写aa的方案有2种:aaaaab、aabaaa。缩写ab的方案有2种:aaabba、aabbba。缩写ba的方案有2种:bbaaaa、bbaaab。缩写aab的方......
  • 假设要销售《C++ For Fools》一书。请编写一个程序,输入全年中每个月的销售量(图书数量,
    #include<iostream>usingnamespacestd;constintMONTHS=12;constchar*months[MONTHS]={"January","February","March","April","May","June","July","Augest","Se......
  • 华为机试HJ81 字符串字符匹配
    首先看一下题描述判断短字符串S中的所有字符是否在长字符串T中全部出现。请注意本题有多组样例输入。数据范围:1≤len(S),len(T)≤200 进阶:时间复杂度:O(n) ,空间复杂度:O(n) 输入描述:输入两个字符串。第一个为短字符串,第二个为长字符串。两个字符串均由小写字母组......
  • 关于el-cascader 双向绑定值v-model的值为字符串的用法
    常规用法绑定的值为数组,但是项目中需要绑定的值为字符串才好,两种解决方式,方式1:按常规写法来做,最后将数据处理成字符串给后端方式2:直接绑定成字符串,不用来回转换格式方式2比较方便,所以选择方式2来做//dom结构<el-form-itemv-if="form.userType==='subject'"label="登......
  • leetcode 1461. 检查一个字符串是否包含所有长度为 K 的二进制子串
    1461.检查一个字符串是否包含所有长度为K的二进制子串 法一:使用unordered_set,通过集合数量来判断classSolution{public:boolhasAllCodes(strings,intk){intsize=s.size();intk_2kFang=pow(2,k);if(size-k+1<k_2kFa......
  • 浅谈字符串(模式串)匹配算法(BF与KMP算法)
    【前言】相信不少学过数据结构的同学有过被KMP算法劝退的经历吧,其实我也一样!记得四月份学到这个算法的时候,自己对于字符串的特性了解很浅薄,再加上这个算法的实现确实太过抽象,引入各种各样的变量和辅助空间看得人眼花缭乱,当时自己只能灰溜溜地把这个知识点直接放弃了,直到后来开......
  • python - 字符串(str)
    例举一下常规用法print('字符串定义')str1='str'str2="str"#声明段落str3='''paragraph'''#使用续行符str4="line1\line2"print('字符串拼接')ret=str1+''+str2print(ret......
  • 写一个方法删除字符串中所有相邻重复的项
    functionremoveAdjacentDuplicates(str){if(!str){return"";//Handleemptyornullinput}letresult="";letprevChar="";for(leti=0;i<str.length;i++){constcurrentChar=str[i];......
  • 多个字符串的存储
    输入:7Bob35Amy28James98Alice11Jack45Smith33Chris62代码:#include<stdio.h>intmain(){intn,sum=0,apprmax=0,appri;scanf("%d",&n);char*name[10000]={0};//错误intnum[10000]={0};for(inti=0;i<n;i++......