
字符串
qq_38232157
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
CodeForces-1285D Dr. Evil Underscores(字典树,dfs)
字典树,dfs 题目意思: 有n个数, 求一个数x ,使得 max{a[i] ^ x}(1 <= i <= n) 最小。 0 ^ 0 == 0, 1 ^ 1 == 0, 0 ^ 1 == 1, 也是是相同的 异或为0, 不同的异或为1; 本题要点: 1、字典树处理 数的异或问题: 用这 n 个数建立一颗 trie, 注意到 a[i] <= 2^30 - 1, 因此每一个数都可以看做是 30 位 的 01 串。 怎样寻找到 x 呢。 一般的查询,是从树的根部开始扫描, 到了某个节点 fa,原创 2020-09-10 17:40:56 · 141 阅读 · 0 评论 -
HOJ 6629 string matching(扩展KMP,裸题)
扩展KMP,裸题 本题要点: 1、题目依次输入的字符串 s1 , s2 , 以 s1 为母串, s2 为子串,运行扩展 KMP 算法, 得到 extend 数组, 题目的伪代码的大概意思,就是把所有的 extend[i] 全部加起来, 但是,有一个注意的地方,就是,当 extend[i], 所表示的范围,如果能触及到 母串 s1 字符串的末尾的话, ans 需要减 1; #include <cstdio> #include <cstring> #include <iostrea原创 2020-09-06 20:55:31 · 161 阅读 · 0 评论 -
HOJ 6153 A Secret(扩展KMP)
扩展KMP 题目意思: 题目的 hit 解释很清楚。 本题要点: 1、 做法: 先把 s1 和 s2 来个翻转。以 s1 为母串, s2 为子串, 运行 扩展 KMP 算法, extend[i] 表示 s2的子串 s2[i, … , extend[i] + i - 1] 与 s1 的子串 s1[0, …, extend[i] - 1] 相等。 这样就说明了, 以下的子串都相等。 s2[i, ... , extend[i] + i - 2] == s1[0, ..., extend[i] - 2] s2[原创 2020-09-06 20:45:41 · 147 阅读 · 0 评论 -
HOJ 4333 Revolving Digits(字符串循环节,扩展KMP)
字符串循环节,扩展KMP 题目意思: 给出一个 数字(数字的位数 最多 100000 位)。 每次把数字第i个放第一位, 然后按顺序数下去, 如果到最后一个,接着就数第 1 个。 n 位 的数字,可能有 n个不同的数字。 样例中的 “341”, 可能有 3 个排法: “341”, “413”。 “134”。 然后,题目问,一共有多少个 数字比原来的数字大,比原来的数字小,和原来的数字相等。 关键的是,这些数字要去重。 本题要点: 1、 开2 倍的空间,处理以每一位数字开头: 比如数字 “48691”(设为原创 2020-09-06 18:31:34 · 175 阅读 · 0 评论 -
HOJ 4300 Clairewd’s message(扩展KMP)
扩展KMP 题目意思: 首先给出 26 个小写字母(这是密文),每个小写字母只出现一次。 第一个小写字母 对应的明文是 ‘a’, 第二个是 ‘b’。 依次类推。 题目的第2个样例的第1个字符串:qwertyuiopasdfghjklzxcvbnm, 那么 ‘q’ 的明文 是 ‘a’, ‘w’ 的明文是 ‘b’ … 第二个字符串, 由两部分组成,第一部分 是 全部的密文, 第二部分是部分的明文(部分明文, 全部明文,或者没有明文)。 问最短可能的字符串是 哪个。 本题要点: 1、以第二个样例为例子: 第2条原创 2020-09-06 17:03:33 · 320 阅读 · 0 评论 -
HOJ 5007 Post Robot(子串查找,水题)
子串查找,水题 本题要点: 1、每一行读入,使用 getline ,然后每一次处理一行 用 string 的 substr 函数来匹配 这些单词。 #include <cstdio> #include <cstring> #include <iostream> #include <string> using namespace std; string line; void solve() { int len = line.size(); for(int原创 2020-08-25 13:09:04 · 165 阅读 · 0 评论 -
HOJ 4513 吉哥系列故事——完美队形II(manacher回文串变形)
manacher回文串变形 本题要点: 1、此题把回文串的条件加强了,条件有3个: a) 要求是回文串 b) 数值先递增,到了对称位置达到最大,然后递减。 2、 假如此类型的回文串叫做 “加强回文串”, 只需要在 manacher 函数里面, 改动一下 while 循环即可。 裸的 manacher算法, while 循环的条件 while(i - RL[i] >= 0 && i + RL[i] < len && ms[i - RL[i]] == ms[i + R原创 2020-08-23 17:57:03 · 108 阅读 · 0 评论 -
HOJ 3068 最长回文(manacher回文串,裸题)
manacher回文串,裸题 本题要点: 1、manacher算法,相对较容易理解。假如字符串的长度是 n, 该方法可以在 O(n)的时间内,求出最长的回文串的长度和具体的回文串 2、此题很裸。 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int MaxL = 120005; char s[Max原创 2020-08-23 17:39:34 · 86 阅读 · 0 评论 -
HOJ 5371 Hotaru‘s problem(manacher回文串变形)
manacher回文串变形 本题要点: 1、一段序列 s 分为 三段 (假设为 x, y, z 三段) x, y拼接起来 和 y,z 拼接起来都是回文串。 2、 用 manacher 算法,在 序列 s 的每个数字之间插入数字0, 得到 数组 ms(ms 数组的个数是 2 * n + 1) 用数组 RL[MaxN], RL[i]表示 数组ms 的第i个数的回文半径 + 1。 3、 假设当前符合条件的最大回文半径是 ans, 扫描数组 RL, 下标从2 开始。 for(int k = 2; k < m;原创 2020-08-23 17:34:12 · 104 阅读 · 0 评论 -
HOJ 3065 病毒侵袭持续中(AC自动机,求多个子串在主串中出现次数)
AC自动机,求多个子串在主串中出现次数 本题要点: 1、与HOJ2896 的区别主要是,这里要求每个子串在文本串的出现次数。 num[i] 表示第i个病毒出现的次数。 在 query 函数中 for(int j = now; j; j = fail[j]) //这里访问一个节点 j 后,不需要把 virus_id[j]置零 { num[virus_id[j]]++; } 2、很多老哥提醒,多组数据。 注意 memset trie, fail, num 数组 #include <cstdio>原创 2020-08-22 19:16:32 · 128 阅读 · 0 评论 -
HOJ 2896 病毒侵袭(AC自动机,模板题)
AC自动机,模板题 本题要点: 1、把多个病毒串,建立 trie, 其中数组virus_id[k] 表示节点是k的点对应的病毒编号 2、建立 fail 数组 3、有m个文本串,没依次查询,都会把数组virus_id[k]对应的值赋值为0,防止重复遍历。 所以,查询完后,需要把数组 virus_id 的数据恢复原来的样子。我这里用的很 low 的方法,直接开一个 数组 virus_id 的副本 virus_id1 。 4、一些注意的地方: 字符串是可见字符,并不只是小写字母。 字典树是 trie[MaxL]原创 2020-08-22 17:10:11 · 194 阅读 · 0 评论 -
HOJ 1062 Text Reverse(字符串翻转,细节)
字符串翻转,细节 本题要点: 1、空格可能有多个 2、字符串前缀和后缀都有空格 3、用 getline 读入字符串 #include <cstdio> #include <cstring> #include <iostream> #include <string> #include <algorithm> using namespace std; int T; string s; void reverse(int a, int b) { for原创 2020-08-20 14:08:00 · 187 阅读 · 0 评论 -
HOJ 1686 Oulipo(KMP, 裸题)
KMP, 裸题 题目意思: 给出a, b 两个字符串,长度分别是 n, m, 求字符串a 在b 中出现的次数。 本题要点: 1、先求出 a 字符串的 next 数组 2、然后在b 字符串 中匹配,指针i指向 b, 指针 j指向a, 当 j == n, j 回溯 j = Next[j]; #include <cstdio> #include <cstring> #include <iostream> using namespace std; const int MaxN原创 2020-08-09 14:29:24 · 139 阅读 · 0 评论 -
POJ 3981字符串替换(string, 水题)
字符串,水题 本题要点: 1、使用 string 的 find 和 replace 函数,每次读取一行,对该 string 操作, 然后输出即可 #include <cstdio> #include <cstring> #include <iostream> #include <string> using namespace std; int main() { string str; int pos; while(getline(cin, str))原创 2020-08-08 18:10:20 · 249 阅读 · 0 评论 -
HOJ 4825 Xor Sum(字典树,异或)
字典树 本题要点: 1、n个数字,按二进制展开,取32位,看做是 32位 的 01 字符串, 每个数字对应一个字符串,n个字符串,建立一颗字典树。 2、对于m次查询,每次查询的数字 x 按二进制展开,某个数字如果是 0, 那么在字典树上按相反方向走, 并累加每一位是1 的值,最后得到的 查询值 query 是数字x 和字典树某个数y的异或值 query = x ^ y, 因此,y = query ^ x = x ^ y ^ x = x。 #include <cstdio> #include &l原创 2020-08-06 00:26:08 · 107 阅读 · 0 评论 -
HOJ 2222 Keywords Search(AC自动机,模板题)
AC自动机,模板题, 参考:https://blog.csdn.net/bestsort/article/details/82947639 题目意思: 给出若干字符串,最后给出一个大的文本字符串,求前面的字符串,在文本字符串中一共出现了多少次 本题要点: 1、AC自动机 用若干模式串,建立字典树,同时为每一个字典树的每一个节点,建立 fail 数组。 2、查询文本串, 统计文本串中出现的模式串的次数。 #include <cstdio> #include <cstring> #inc原创 2020-08-05 21:52:34 · 110 阅读 · 0 评论 -
CodeForces 1137B Camp Schedule(KMP的next数组)
KMP的next数组, 参考:https://blog.csdn.net/weixin_42102584/article/details/88360361 题目意思: 给出两个0-1字符串s和t,问如何重排s可以使得产生的新字符串中包括最多的连续子串t,输出重排结果。 本题要点: 1、对字符串 t 计算 next 数组, next[lent] 就是字符串t的最长的前后缀, 假如 next[lent] == idx, 坐标范围 [1, idx] 这部分字符串假设是 x 坐标范围 [idx + 1, lent]原创 2020-08-05 20:54:07 · 186 阅读 · 0 评论 -
HOJ 2087 剪花布条(KMP,裸题)
KMP,裸题 本题要点: 1、先求出a字符串的next数组 2、再用b字符串和a数组来匹配,注意,每次匹配完成,就剪断对应的字符串,因此, 当 f[i] == n, 把 j 置零 #include <cstdio> #include <cstring> #include <iostream> using namespace std; const int MaxN = 1010; char a[MaxN], b[MaxN]; int Next[MaxN], f[MaxN];原创 2020-08-05 10:57:27 · 134 阅读 · 0 评论