![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
字符串
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 · 95 阅读 · 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 · 111 阅读 · 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 · 111 阅读 · 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 · 131 阅读 · 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 · 273 阅读 · 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 · 135 阅读 · 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 · 88 阅读 · 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 · 65 阅读 · 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 · 81 阅读 · 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 · 100 阅读 · 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 · 163 阅读 · 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 · 144 阅读 · 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 · 116 阅读 · 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 · 212 阅读 · 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 · 81 阅读 · 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 · 81 阅读 · 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 · 146 阅读 · 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 · 107 阅读 · 0 评论