首页 > 其他分享 >字符串专题1

字符串专题1

时间:2023-05-19 11:03:54浏览次数:30  
标签:专题 frac 后缀 len 查询 即可 字符串

A.CF547E Mike and Friends

多校考过,当时拿根号过的

建立 \(AC\) 自动机,询问转成差分形式,每次把一个字符串的所有前缀位置都 \(+1\), 询问某个点子树内总和

树状数组即可

用广义 \(SAM\) + 线段树合并也可以无脑过

B. Misha and LCP on Tree

匹配两个串好像除了 \(Hash\) 也没啥太好的办法

树剖,每次把字符串的区间按顺序取出,维护正反 \(Hash\) 进行比较即可

C.CF204E Little Elephant and Strings

省选互测5,T2

广义SAM+set维护在哪些串中出现过,然后每个串匹配查询即可

D. AB-Strings

相同的压缩处理,尽量一次操作消去两对,于是分讨开头是否相同,尽量让两串长度相近

E. String Problem

考虑已知 \(i\) 的,求 \(i + 1\) 的答案

首先答案一定是 \(i\) 答案或其 \(border\) 加上新字符构成,自证不难

暴跳 \(border\), 如果更优则一直跳,否则不跳

不跳是因为随着长度减小,后面的字母一定不增

否则之前就会把较长的替代

F.Suffix Automaton

首先容易定长,然后在后缀树上 \(DFS\) 序就是字典序,每个节点对应的长度都是一个区间,下来扫描线+线段树求第 \(K\) 个位置

G. Substrings in a String

分块,每 \(B\) 个处理一个后缀自动机/KMP啥的,修改暴力重构

对询问进行阈值分治, \(>= B\) 的直接做后缀自动机/KMP \(\frac{n^2}{B}\)

考虑 \(< B\) 的,每个块暴力查询 \(\frac{n^2}{B}\),块之间暴力查询 \(nB\)

复杂度 \(\frac{n^2}{B} + nB\)

但是,,,,,,,,,,

用 \(bitset\) 可以爆标 \(\frac{n^2}{\omega}\)

H.CF700E Cool Slogans

省选互测3,T1

\(s_{i - 1}\) 为 \(s_{i}\) 的后缀一定不劣,考虑在 \(parent\) 树上 \(DP\)

考虑 \(x\) 的祖先 \(y\),如果 \(y\) 在 \(x\) 中出现两次,只需要判断 \([pos(x) - len(x) + len(y), pos(x) - 1]\) 中是否存在 \(y\) 即可

使用线段树合并即可快速查询

由于我们只关心\(parent\) 树上父子节点的关系,所以都取到 \(len\) 是可以的

在 \(k\) 相同时,我们希望子串越短越好,所以记录每个答案对应的深度最浅的点,这样每次转移只需要判断一次即可

标签:专题,frac,后缀,len,查询,即可,字符串
From: https://www.cnblogs.com/Chencgy/p/17414267.html

相关文章

  • Golang高性能编程笔记--字符串拼接
    Golang中引入五种字符串拼接方法,分别如下:1.+拼接法2.fmt.Sprintf()3.strings.Builder4.bytes.Buffer5.[]byte代码示例,这里将根据《Go语言高性能编程》中的一节,来看一下这五种具体的方法:packagemainimport( "bytes" "fmt" "math/rand" "strings......
  • 把字符串转换成整数
    classSolution{public:boolcheck(charc){if(c=='+')returntrue;if(c=='-')returntrue;if(c>='0'&&c<='9')returntrue;returnfalse;}intstrT......
  • 流程控制和一些字符串内部读取关键词或格式
    1.流程控制1.while+continue立即调出本次循环,同属一个代码块后面的代码都不会进行,直接回到while   //不仅可以用在while中,for循环中也可以例:1#打印出0到5的数字,除了32x=03whilex<=5:4ifx==3:5x+=16continue7els......
  • 整型&浮点型&字符串 内置方法
    目录int整型float浮点型str字符串int整型进制转换print(bin(10))#0b10100b代表的就是二进制print(oct(10))#0o120o代表的是八进制print(hex(10))#0xa0x代表的是十六进制#其他进制转十进制print(int('0b1010',2))#10print(int('0o12',8))......
  • Python字符串替换的3种方法
    Python字符串替换笔记主要展示了如何在Python中替换字符串。Python中有以下几种替换字符串的方法,本文主要介绍前三种。replace方法(常用)translate方法re.sub方法字符串切片(根据Python字符串切片方法替换字符)1.replace方法Pythonreplace方法把字符串中的old(旧字符串)替换成......
  • Python基础语法(四)—列表、元组、字典、集合、字符串
    Python基础语法(一):https://blog.zeruns.tech/index.php/archives/54/Python基础语法(二):https://blog.zeruns.tech/index.php/archives/112/Python基础语法(三):https://blog.zeruns.tech/index.php/archives/150/Python基础语法(四):https://blog.zeruns.tech/index.php/archives/299/列......
  • 代码随想录算法训练营第九天|28. 找出字符串中第一个匹配项的下标、459. 重复的子字符
    【参考链接】28.找出字符串中第一个匹配项的下标【注意】1.kmp解决的就是字符串匹配的问题。2.kmp如何知道匹配过哪些字符串,并跳到匹配过的内容后面的字符。---前缀表3.找到一个子字符串里它的最长相等前后缀。4.前缀是包含首字母,不包含尾字母的所有子串;后缀只包含尾字母,不......
  • python之字符串和运算符
    python基本数据类型python之字符串和运算符字符串格式化字符串print(6+6)print('6'+'6')print('jerr'+'y')#print(6+'6')两个不同类型的相加会报一个类型错误1266jerry拼串s='hello'print('s='+s)用+号来进行拼串s=hello传递参数s=......
  • Java中的字符串
    目录一、简介二、字符串定义2.1直接定义字符串2.2通过使用String类的构造方法来创建字符串三、如何使用JavaAPI帮助文档3.1帮助文档下载地址3.2帮助文档使用3.2中文帮助文档四、String字符串和int、double、float的相互转换4.1String转int4.2String转Double、Flo......
  • Java字符串就是Unicode字符序列
    一、简介Java字符串就是Unicode字符序列。Java里没有内置的字符串类型,而是在标准的类库中提供了一个预定义类,String。每个用双引号""括起来的都是String类的一个实例。字符串是日常开发中最常用,Java字符串的一个重要特点就是字符串不可变二、字符串定义2.1直接定义字符串......