字符相关
文章平均质量分 63
kmp,trie,sam
scau_sleep(今天写bug了吗?
1.一个退役acmer,老年选手
2. 今天喝水了吗?
3. 会写暴力~比不会写强~比不会写优秀
4.不会三分,喜提铁牌。
5. 失败一次不算什么,胸针为了拯救真由里 和 助手。重来3000多次都可以,那我失败几次,又算什么。(命运石之门)
-------如果说这是命运石之门的意志的话
展开
-
后缀数组简要笔记
后缀数组,简要笔记原创 2022-10-22 12:14:34 · 421 阅读 · 0 评论 -
后缀数组代码实现部分(c++&&java)
后缀数组原创 2022-10-22 12:13:36 · 242 阅读 · 0 评论 -
AtCoder Beginner Contest 272 F - Two Strings(后缀数组)
AtCoder Beginner Contest 272 F - Two Strings(后缀数组)原创 2022-10-09 18:46:00 · 434 阅读 · 0 评论 -
mancher
Manacher描述:给定一个长度为 nnn 的字符串 sss ,请找到所有对(i,j)(i,j)(i,j)使得子串s[i...j]s[i...j]s[i...j]为一个回文串。当t=trev时,字符串t是一个回文串(trev是t的反转字符串)t = t_{rev}时,字符串t是一个回文串(t_rev是t的反转字符串)t=trev时,字符串t是一个回文串(trev是t的反转字符串)更进一步的描述:显然在最坏情况下可能有O(n2)O(n^2)O(n2)个回文串,因此似乎一眼看过去该问题并没有线性算原创 2021-05-11 12:57:46 · 101 阅读 · 0 评论 -
Codeforces Round #715 (Div. 2) D. Binary Literature
题目地址:传送门题意:给你三个串,长度为2n2n2n,构造一个ansansans串的长度为3n3n3n,使得有两个串是是ansansans的subsequencessubsequencessubsequences子序列。思考:首先可以想到一种暴力的做法,两两枚举,之后找lcslcslcs,假如len(lcs)==nlen(lcs) == nlen(lcs)==n,那么就找到答案了。但是朴素的lcs复杂度是O(n2)O(n^2)O(n2)思路1:(这题是div2d,且串的字符只有两种)对于原创 2021-04-18 19:34:31 · 93 阅读 · 0 评论 -
又入lcm,O(n)写法,(SAM)
当两个字符串的长度大于 1e51e51e5时显然之前的dp思路会超时,这里引入SAMSAMSAM的解法题目描述思路:先考虑,只有两个串的情况对于两个串,直观的想法是:先对AAA串求一遍SAMSAMSAM,之后就相当于有了AAA的所有子串。暴力解法:对于B串每次枚举一个起点,在SAMSAMSAM里跑(A建立的SAMSAMSAM中跑),当匹配失败时,又要重新枚举起点。o(n2)o(n^2)o(n2)显然会超时。利用SAMSAMSAM的性质:当匹配失败时,重新枚举起点时,由于当原创 2021-03-25 22:17:43 · 95 阅读 · 0 评论 -
E - 生成魔咒 黑暗爆炸 - 4516
E - 生成魔咒 黑暗爆炸 - 4516SAMSAMSAM的模板题AC/*皮卡丘冲鸭!へ /| /\7 ∠_/ / │ / / │ Z _,< / /`ヽ │ ヽ / 〉 Y ` / / イ● 、 ● ⊂⊃〈 / () へ | \〈 >ー 、_ ィ │ // / へ / ノ<| \\ ヽ_ノ (_/ │// 7 |/ >―r ̄ ̄`ー―_*/#include <原创 2021-03-24 18:20:03 · 118 阅读 · 2 评论 -
SAM似神仙,入门到入土。。。(y总的笔记)
一、SAMSAMSAM的性质:SAMSAMSAM是一个状态机。一个起点,若干终点。原串的所有子串和从SAMSAMSAM起点开始的所有路径一一对应,不重不漏。所以终点就是包含后缀的点。每个点包含若干子串,每个子串都一一对应一条从起点到该点的路径。且这些子串一定是里面最长子串的连续后缀。SAMSAMSAM问题中经常考虑两种边(绿边和蓝边)普通边:类似于TrieTrieTrie。表示在某个状态所表示的所有子串的后面添加一个字符。(蓝边)Link,FatherLink, Fat.原创 2021-03-24 18:18:10 · 114 阅读 · 0 评论 -
SAM模板题
#include <iostream>#include <cstring>#include <algorithm>using namespace std;typedef long long LL;const int N = 2e6+10;int tot = 1, last = 1;struct Node{ int len, fa; //fa 是绿边 int ch[26];} node[N];char str[N];..原创 2021-03-24 16:11:48 · 88 阅读 · 0 评论 -
Nikitosh 和异或 LibreOJ - 10051( 01Trie && dp)
Nikitosh 和异或 LibreOJ - 10051 题解:本题题意是找到两个不相交区间,使得他们的异或和最大。思路:本题就是强硬套 01Trie 树即可。先把区间预处理一下,处理一个异或前缀和一个异或后缀。之后dp【i】。表示 iii 以前的最大异或和。(这里因为每次查看时,都是把一个前缀加入)所以可以利用trie,查找一个区间的最大异或值。转换为了求两个数的异或值,就是常规操作了。两个数的最大异或和,传送门最后再,反着来一遍即可。反思:本题要求你求两个区间的异或和。原创 2020-10-05 23:47:40 · 109 阅读 · 0 评论 -
Phone List POJ - 3630(Trie 基本操作)
Phone List POJ - 3630题意:给你n个字符串。要求你判断是否有字符串是其他字符串的 前缀。思路:其实就是插入。这里插入分两种情况。假如当前的串str为字典里面串的前缀。(这种情况就是插入时,不会碰到新结点)字典里的串是str的前缀。(这种情况插入时,查看当前结点是不是某个串的结尾)AC#include <iostream>#include <cstring>#include <cstdio>#include <strin原创 2020-10-05 16:56:29 · 83 阅读 · 0 评论 -
The xor-longest Path POJ - 3764(Tire&&dfs&&贪心)
The xor-longest Path POJ - 3764题意:本题是求异或路径的最大。思路:关于求n个数里,异或最大的思路。传送门。先把每个点到根的异或路径算出来d【i】。那么u和v两两之间的异或路径。就可以转换成d【u】^d【v】。之后问题就转换成:n个数里,异或最大。反思:本题要用到快读。(不然会TLE。当然scanf也可。)AC#include <iostream>#include <cstring>#include <vector&g原创 2020-10-05 16:09:12 · 77 阅读 · 0 评论 -
The XOR Largest Pair LibreOJ - 10050(Trie && 贪心)
The XOR Largest Pair LibreOJ - 10050题意:给你n个数,要你找到两个数。使他们的异或最大。思路:直接找肯定TLETLETLE,所以这时候要引进Trie树。每次碰到一个数xxx,都把xxx按照二进制,加入trie树中。(这里的加入从二进制最高位开始看)每次加入一个数xxx之前,可以把这个数xxx与这棵trie树进行异或操作。(每次都贪心地取位数)...原创 2020-10-05 15:56:28 · 127 阅读 · 2 评论 -
UVA11732 Trie (恢复训练&&课设练习)
题意:给你n个字符串。要你两两进行比较。求总共的比较次数。思路:用trie去优化。细心观察可以发现,可以边读入边计算ans。每读入一个word进trie里时,就可以计算不过中间的逻辑关系要理清。本题结点的val,改为记录字符串的个数。当insert一个word时,即遍历word时。假设当前结点为u,那么儿子为v。此时就可以计算答案。ans+=(val[u]-val【ch【u】【c】】) x (len-1) x 2+(val[u]-val【ch【u】【c】】)(这一步运用了容斥原创 2020-10-01 20:13:33 · 108 阅读 · 0 评论 -
UVA - 1401-------trie&&dp
Remember the Word UVA - 1401(传送门)题意:给你一个字典。和一个模式串。现在要求你按照字典分割模式串。求:方案数。思路:很容易想到递推的思想。一般思路:先原创 2020-10-01 14:45:41 · 85 阅读 · 0 评论 -
Password CodeForces - 126B ---z函数(kmp当然也可以做,但是这里学下新知识)
Password CodeForces - 126BAC(From K0u1e)#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int maxn = 1000100;char s[maxn],ans[maxn];int z[maxn],n;void z_function(char *s){ int l=0,r=0; for(原创 2021-02-28 12:19:39 · 122 阅读 · 0 评论 -
Theme Section HDU - 4763(kmp )
Theme Section HDU - 4763 题意:给你一个字符串s。要求你找到最长的前缀&&中缀&&后缀。思路:可以对串s求next假如nxt【len】x 3 >len.(那么说明太长了,要缩短)可以len=nxt【len】。之后贪心的找就可以了。把s按照长度next【len】切割成 三部分。(nxt【len】+(len-nxt【len】-nxt【len】)+nxt【len】)对长度为nxt【len】的字符串,再求一次next2. 把它与中间原创 2020-10-12 12:41:58 · 82 阅读 · 0 评论 -
Clairewd’s message HDU - 4300(kmp&&思维)
Clairewd’s message HDU - 4300题意:给你两个字符串。串1:为加密方法。串2:为 密文+明文(明文可能不完整)要求:输出最小的,且完整的密文+明文思路:可以先想到,密文肯定是大于len/2.那么就找到了明文是后半段,(不一定)。设这一串为T。之后根据加密方法,逆推:把串2都转换为原文。设此串为p对p求next,并与s进行kmp即可。(返回jjj值,成功匹配的个数,即串2中有的原文)输出(考虑到要转换,可以先把串2输出,之后再把不齐的补全即可)。AC#原创 2020-10-09 17:49:58 · 100 阅读 · 0 评论 -
Simpsons’ Hidden Talents HDU - 2594(kmp的应用)
Simpsons’ Hidden Talents HDU - 2594题意:给你两个串s1,s2 。要你求第一个串s1的前缀 等于 s2的最长。且要最长。思路1:把两串合并,就是求next了。不过注意,求完后的长度要小于len1和len2.思路2:利用kmp去求。把s1当成模式串。之后去匹配第二个串,返回值为jjj的值.AC1(思路1,char)#include <iostream>#include <cstring>using namespace std原创 2020-10-09 15:41:37 · 81 阅读 · 0 评论 -
Blue Jeans POJ - 3080(kmp暴力)
Blue Jeans POJ - 3080题意:给你n个DNA序列。(不超过10个)。求:公有的最长序列,假如有多个长度相等时。输出字典序最小的。思路:暴力枚举即可。反思:strcmp(const char *s1 , cosnt char *s2).s1>s2时,strcmp>0;s1<s2时,strcmp<0;s1=s2时,strcmp=0;strcpy(char *s, const char *p).把p复制到s。strncpy(char *s,原创 2020-10-08 22:34:55 · 79 阅读 · 0 评论 -
Power Strings POJ - 2406(kmp, 循环节)
Power Strings POJ - 2406 题意:给你一个串,要求你划分成由 k个循环节组成的串。输出:字符串由几个循环节构成。思路:就是普通循环节。求法的传送门反思:这一道题,刚开始做的时候,以为题目是给的循环串。(结果看错题目了,一直wa。qaq)1million是1e6.AC#include <iostream>#include <cstring>#include <cstdio>using namespace std;co原创 2020-10-08 16:35:33 · 85 阅读 · 0 评论 -
Period HDU - 1358(kmp&&循环节)喝水,喝水,我爱喝水
Period HDU - 1358题意&&思路:基本和uva那道eg题一模一样。Period UVA - 1328 AC#include <iostream>#include <cstring>using namespace std;const int maxm=1e6+10;char p[maxm];int m, nxt[maxm];void getnxt(){ int i=0, j=-1; nxt[0]=-1; whi原创 2020-10-08 10:25:10 · 77 阅读 · 0 评论 -
Cyclic Nacklace HDU - 3746(kmp 循环节的应用)
Cyclic Nacklace HDU - 3746 题意:给你一个模式串。判断加几个字符,可以使他变成有循环节的串。思路:求循环节循环节 的传送门先求出字符串的next。之后看最后一个字符的next。假如刚好可以凑成循环节,那么就输出ans。否则 补齐即可。(考虑abcabcab和 abca)AC#include <iostream>#include <cstring>#include <cstdio>using namespace原创 2020-10-08 10:10:57 · 83 阅读 · 0 评论 -
剪花布条 HDU - 2087(kmp&&贪心)
剪花布条 HDU - 2087 题意:给你一个文本串T,和一个模板串p。要求你把T分割,分割成最多的p。思路:贪心分割即可。AC#include <iostream>#include <cstring>using namespace std;int nxt[2000];void getnxt(char *p){ int m=strlen(p); int i=0,j=-1; nxt[0]=-1; while(i<m){原创 2020-10-07 21:35:46 · 81 阅读 · 0 评论 -
Oulipo HDU - 1686(kmp)
Oulipo HDU - 1686 题意:要你求有几次成功匹配(允许重叠)AC#include <iostream>#include <cstring>using namespace std;const int maxn=1e6+10;const int maxm=1e4+10;char s[maxn],p[maxm];int nxt[maxm];void getnxt(char *p){ int m = strlen(p); int i=0,j原创 2020-10-07 16:43:48 · 92 阅读 · 0 评论 -
Number Sequence HDU - 1711(KMP模板)
Number Sequence HDU - 1711 (kmp模板提)题意&&思路:模板题,不再赘述。AC#include <iostream>#include <cstdio>#define foR(i,x,y) for(int i=(x); i<y; i++)#define For(i,x,y) for(int i=(x); i<=(y); i++)using namespace std;const int maxn=1e6+10;原创 2020-10-07 16:13:25 · 75 阅读 · 0 评论 -
Period UVA - 1328(kmp求循环节)
Period UVA - 1328题意:给你一个串。要求你计算每个前缀是否可以由一个循环节,重复k次得到(k>1)思路:就是模板题。后缀函数的定义,“错位部分”长度为i−next[i]i-next[i]i−next[i].如果这iii个字符串组成一个周期串,那么“错位”部分恰好就是一个循环节。条件.k>1.k(i−next[i])=ik(i-next[i])=ik(i−next[i])=iAC#include <iostream>#include <原创 2020-10-07 15:54:25 · 119 阅读 · 1 评论 -
第三章使用数据结构 3.3.2字符串 kmp (大白书)
3.3 字符串3.3.2Kmp模板在这里插入代码片模板题Number Sequence HDU - 1711 next应用循环节。Period UVA - 1328原创 2020-10-12 12:43:24 · 113 阅读 · 0 评论