字符串
文章平均质量分 70
kkkkahlua
这个作者很懒,什么都没留下…
展开
-
HDU 6194 string string string 后缀数组+rmq
题目链接题意问一个字符串有多少个子串出现恰好 kk 次思路求出 heightheight 数组后,对于相邻的 kk 个后缀,它们包含恰好出现 kk 次的子串当且仅当 k−1k-1 个 heightheight 值中的最小值 >\gt max{max\{其中第一个与前一个的公共前缀,其中最后一个与后一个的公共前缀}\},差值即为这一段的个数。遍历一遍统计即可,最小值用 rmqrmq。注意 k=1k=1原创 2017-09-15 19:20:47 · 262 阅读 · 0 评论 -
Codeforces 536B Tavas and Malekas kmp找所有与前缀匹配的后缀
题目链接题意有只含小写字母的字符串 TT,其中出现了若干次字符串 PP,并升序给出其中一部分 PP 的起始位置,要求 TT 有多少种不同的可能。思路就是找有多少空缺位置 kk,答案就是 26k26^k.按顺序把 PP 往 TT 中填充,同时记录空缺位置。此时需要判断是否与之前已填充的部分矛盾,其实就是判断给定的 PP 的前缀与后缀是否匹配。直接比较显然会 tletle. 故应预处理出 PP 的所有与原创 2017-09-21 20:47:34 · 424 阅读 · 0 评论 -
hdu 1358 & hdu 3746 & poj 2406 & uva 12012 循环节与kmp
参考kmp next函数 kmp的周期问题,深入了解kmp中next的原理 ——Because Of YouHDU 1358题意对于给定的字符串 TT,对其每一个前缀,问其是否由若干个循环节祖成。思路充要条件:len%(len−fail[len])==0len \% (len-fail[len]) == 0Code#include <bits/stdc++.h>#define maxn 10原创 2017-09-19 20:14:07 · 343 阅读 · 0 评论 -
HDU 1867 A + B for you again 字符串拼接 kmp
题目链接题意给定两个字符串 AA,BB,可以拼成 ABAB 也可以拼成 BABA,拼接时前缀与后缀的相同部分在拼接成的字符串中只出现一次。要求输出最短的且字母序最小的字符串。这道题关键是要读懂题意= =思路基本同HDU 2594 Simpsons’ Hidden Talents 两字符串前缀与后缀的最长公共部分.直接用 failfail 数组就完了。Code#include <bits/stdc++原创 2017-09-20 20:26:58 · 270 阅读 · 0 评论 -
HDU 6208 The Dominator of Strings 读入挂+kmp / AC自动机
题目链接题意给定 nn 个串,问是否存在一个串包含其它所有串。读入的问题The total length of strings in each case has the limit of 100000.The limit is 30MB for the input file.考虑将所有的串读到一整个串里,记录每个串在其中的开始位置和长度注意:这种情况下,如果每个串末尾有 '\0',则开的长度不是原创 2017-09-20 09:32:50 · 305 阅读 · 0 评论 -
HDU 2594 Simpsons’ Hidden Talents 两字符串前缀与后缀的最长公共部分
题目链接题意对于给定的两个字符串 TT 与 PP,求最长的子串,既是 PP 的前缀,又是 TT 的后缀。法一:kmp思路对 PP 求 failfail 数组,然后与 TT 进行匹配,最大长度即为匹配到最后的公共长度。注意在中间就匹配成功时处理一下。Code#include <bits/stdc++.h>#define maxn 100010using namespace std;typedef原创 2017-09-19 21:25:08 · 539 阅读 · 0 评论 -
HDU 4749 & POJ 3167 kmp变形
HDU4749题意给定一个主串 TT 和模式串 PP,问 TT 有多少个不重合的子串与 PP 匹配。在这里,串 aa 与串 bb 匹配的含义是,∀i,j,1≤i,j≤n,⎧⎩⎨a[i]<a[j]↔b[i]<b[j]a[i]==a[j]↔b[i]==b[j]a[i]>a[j]↔b[i]>b[j]\forall i,j,1\leq i,j\leq n,\begin{eqnarray}\begin{cas原创 2017-09-19 16:57:08 · 499 阅读 · 0 评论 -
HDU 3336 Count the string 所有前缀在串中的出现总次数
题目链接题意给定一个串 SS,求其所有前缀在其中的出现次数的总和。思路考虑 failfail 数组,fail[i]=jfail[i] = j 的含义是 S[0..j−1]==S[i−j..i−1]S[0..j-1] == S[i-j..i-1].记 dp[i]dp[i] 为以 ii 结尾的串中与前缀相同的串的个数。由 fail[i]=jfail[i] = j 有 S[0..j−1]==S[i−j..原创 2017-09-19 18:58:23 · 870 阅读 · 1 评论 -
后缀数组倍增算法模板详解
参考2009国家集训队论文 后缀数组——处理字符串的有力工具 ——罗穗骞模板bool cmp(int* r, int a, int b, int l) { return r[a] == r[b] && r[a+l] == r[b+l]; }void init(int* r, int* sa, int n, int m) { int* x=wa, *y=wb, *t, i, j, p;原创 2017-09-15 13:39:45 · 568 阅读 · 0 评论 -
Codeforces 526D Om Nom and Necklace 循环节 kmp
题目链接题意给定一个串 TT,对它的每一个前缀能否写成 A+B+A+B+...+B+AA+B+A+B+...+B+A 的形式(kk 个 AA,k+1k+1 个 BB,均可为空串)思路A+B+A+B+...+B+AA+B+A+B+...+B+A 可以看做 AB+AB+AB+...+AAB+AB+AB+...+A,即 kk 个 ABAB 和 11 个 AA. 也就是判断这个串 能否被表示为 kk 个循原创 2017-09-22 15:30:03 · 628 阅读 · 1 评论