随笔分类 -  字符串--------------------------

摘要:【题意】阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机。打字机上只有28个按键,分别印有26个小写英文字母和'B'、'P'两个字母。 经阿狸研究发现,这个打字机是这样工作的: l 输入小写字母,打字机的一个凹槽中会加入这个字母(这个字母加在凹槽的最后)。 l 按一下印有'B'的按键,打字 阅读全文
posted @ 2018-04-25 13:18 ONION_CYC 阅读(322) 评论(0) 推荐(0)
摘要:【题目】F. Substrings in a String 【题意】给定小写字母字符串s,支持两种操作:1.修改某个位置的字符,2.给定字符串y,查询区间[l,r]内出现y多少次。|s|,Σ|y|<=10^5,time=6s。 【算法】Bitset 【题解】假设S的长度为n,那么对每个字符建一个长度 阅读全文
posted @ 2018-04-19 08:23 ONION_CYC 阅读(238) 评论(0) 推荐(2)
摘要:【题目】F. k-substrings 【题意】给定长度为n的串S,对于S的每个k-子串$s_ks_{k+1}...s_{n-k+1},k\in[1,\left \lceil \frac{n}{2} \right \rceil]$,找到满足[奇数长度][严格子串][同时是前缀和后缀]的最长子串。n< 阅读全文
posted @ 2018-04-13 20:58 ONION_CYC 阅读(556) 评论(0) 推荐(0)
摘要:【题目】A. A String Game 【题意】给定目标串S和n个子串Ti,Alice和Bob轮流选择一个子串操作,必须且只能在子串末尾添加一个字符使得新串也是S的子串,不能操作即输,求胜利者。|S|<=10^5,n<=100。多组数据,保证Σ|S|<=3*10^7。 【算法】后缀自动机+博弈论S 阅读全文
posted @ 2018-03-28 22:27 ONION_CYC 阅读(1070) 评论(0) 推荐(1)
摘要:【题目】B. Restoration of string 【题意】当一个字符串在字符串S中的出现次数不小于任意子串的出现次数时,定义这个字符串是高频字符串。给定n个字符串,求构造出最短的字符串S满足着n个字符串都是高频字符串,若不存在输出NO,若存在多个输出字典序最小的一个。n<=10^5,Σ|si 阅读全文
posted @ 2018-03-15 21:18 ONION_CYC 阅读(320) 评论(0) 推荐(0)
摘要:【题意】给定n个禁忌字符串和字符集大小alphabet,保证所有字符在集合内。一个字符串的禁忌伤害定义为分割能匹配到最多的禁忌字符串数量(一个可以匹配多次),求由字符集构成的长度为Len的字符串的期望禁忌伤害。n<=5,1<=alphabet<=26,len<=10^9。 【算法】AC自动机+期望+ 阅读全文
posted @ 2018-03-13 10:37 ONION_CYC 阅读(236) 评论(0) 推荐(1)
摘要:【题意】给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量。(60%)n,m<=50,L<=100。(40%)原串长度为1或2,L<=10^18。 【算法】AC自动机+DP+矩阵快速幂 【题解】其实题意的数据范围不太清晰,反正开200个点就足够了。 因为要匹配禁忌串,所以 阅读全文
posted @ 2018-03-12 13:41 ONION_CYC 阅读(476) 评论(0) 推荐(1)
摘要:【题目】C. Perfect Security 【题意】给定长度为n的非负整数数组A和数组B,要求将数组B重排列使得A[i]^B[i]的字典序最小。n<=3*10^5,time=3.5s。 【算法】异或Trie 【题解】对一个数组O(n log n)建立异或Trie,就能O(log n)判断任意一个 阅读全文
posted @ 2018-03-11 19:42 ONION_CYC 阅读(440) 评论(0) 推荐(0)
摘要:【题意】给定只含小写字母的字符串s,定义价值为回文子串的长度*出现次数,求最大价值。n<=3*10^5。 【算法】回文树 【题解】回文树上一个点的被访问次数是其作为最长回文子串的出现次数。 将fail边反向连接建树后,每个点的子树访问次数和就是这个回文子串的出现次数,可以dfs解决。 注意:要从-1 阅读全文
posted @ 2017-12-27 19:03 ONION_CYC 阅读(367) 评论(0) 推荐(1)
摘要:【题意】给定长度为n的小写字母字符串S,求第k小子串。n<=5*10^5。 给定T,T=0时不同位置的相同子串算一个,T=1时算多个。 【算法】后缀自动机 【题解】对S建立SAM,T=0则每个节点算1次,T=1则每个节点算Right次,那么第k小就是dfs到恰好前k个的位置就是答案(SAM自带字典序 阅读全文
posted @ 2017-12-27 13:30 ONION_CYC 阅读(467) 评论(0) 推荐(1)
摘要:【题意】给定长度为n的小写字母字符串,令Ti表示以i开头的后缀,求Σ[Ti+Tj-2*lcp(Ti,Tj)],1<=i<j<=n。 【算法】后缀自动机 【题解】Σ(Ti+Tj)只与n有关,那么关键在于计算Σ2*lcp(Ti,Tj)。 对逆序串建后缀自动机,其parent树就是原串的后缀树,lcp(T 阅读全文
posted @ 2017-12-27 08:57 ONION_CYC 阅读(307) 评论(0) 推荐(1)
摘要:【题意】给定两个字符串S和T,求最长公共子串。len<=10^5。 【算法】后缀自动机 【题解】对字符串S建SAM,然后令串T在S上跑匹配。 这是自动机最原本的功能——匹配,就是串T在SAM(S)上走,不能匹配就沿失配边走,这样得到的是T上以每个字符结尾的子串中与S的最长公共子串,取Max即是答案。 阅读全文
posted @ 2017-12-26 16:42 ONION_CYC 阅读(150) 评论(0) 推荐(0)
摘要:【题意】给定长度为n和m的两个字符串S和T,要求在字符串S中取出若干段拼成T(可重复取),求最小段数,n,m<=50000。 【算法】后缀自动机 || 后缀数组 【题解】对串S建SAM,然后在上面尽可能地匹配T,匹配几次得到T就是答案。 #include<cstdio> #include<cstri 阅读全文
posted @ 2017-12-26 15:46 ONION_CYC 阅读(284) 评论(0) 推荐(0)
摘要:后缀自动机是用于识别子串的自动机。 学习推荐:陈立杰讲稿,本文记录重点部分和感性理解(论文语言比较严格)。 刷题推荐:[后缀自动机初探],题目都来自BZOJ。 【Right集合】 后缀自动机真正优于后缀树的方面在于:结合了有限状态自动机,从而实现了O(n)的时空复杂度。 trans(s,str)表示 阅读全文
posted @ 2017-12-26 10:33 ONION_CYC 阅读(2388) 评论(0) 推荐(0)
摘要:【题意】给定小写字母字符串s,求最长的 [ 可以分成左右两个回文串的 ] 子串,n<=10^5。 【算法】回文树 【题解】对于每个字符x,处理出以x结尾的最长回文串,以x开头的最长回文串,然后枚举中间点求解。 只须正反用两次回文树就可以处理完毕。 #include<cstdio> #include< 阅读全文
posted @ 2017-12-10 19:20 ONION_CYC 阅读(250) 评论(0) 推荐(0)
摘要:【题目】D. Acyclic Organic Compounds 【题意】给定一棵带点权树,每个点有一个字符,定义一个结点的字符串数为往下延伸能得到的不重复字符串数,求min(点权+字符串数),n<=300000,time=3s。 【算法】trie合并||hash+线段树合并||dsu on tre 阅读全文
posted @ 2017-12-06 19:40 ONION_CYC 阅读(398) 评论(0) 推荐(0)
摘要:【题意】求最长的出现至少k次的子串。 【算法】后缀数组+单调队列 【题解】求出所有LCP,然后SA上每k个找一个最小值,取所有最小值中的最大值。 移动区间最小值,显然可以用单调队列优化。 注意:队列左闭右开时,访问队尾一定要tail-1。 求LCP时,只能按字符串顺序求才满足O(n)的规律。 #in 阅读全文
posted @ 2017-08-28 20:46 ONION_CYC 阅读(234) 评论(0) 推荐(0)
摘要:【算法】字符串hash 【题解】 显然如果字母互不相同,贪心取是正确的。 如果存在字母相同,那么就换成比较后缀和前缀嘛。 但是要注意,不是后缀和前缀相同就能直接跳跃,每次必须只推一位。 取模的哈希比自然溢出慢了好多。 #include<cstdio> #include<algorithm> #inc 阅读全文
posted @ 2017-08-28 19:04 ONION_CYC 阅读(223) 评论(0) 推荐(0)
摘要:【算法】trie树+xor路径 【题解】 套路1:统计从根到每个点的xor路径和,由于xor的自反性,两个点到根的xor路径和异或起来就得到两点间路径和。 然后问题就是找到n个值中异或值最大的两个值,考虑枚举每个数字,对于一个数找到与其异或和最大的数。 套路2:对所有数值二进制建01-trie,对于 阅读全文
posted @ 2017-08-09 19:31 ONION_CYC 阅读(241) 评论(0) 推荐(0)
摘要:【算法】trie 【题解】 为了让数据有序,求lowbit无法直接排序,从而考虑倒过来排序,然后数据就会呈现出明显的规律: 法一:将数字倒着贴在字典树上,则容易发现两数的lowbit就是它们岔道结点的深度,所以先建树后对于一个数字依次把每次分岔开的另一边的size乘上权值累加答案。 法二:从高位到低 阅读全文
posted @ 2017-06-26 19:49 ONION_CYC 阅读(260) 评论(0) 推荐(1)