
字符串
兜率工
XJTU 硕士研究生在读
展开
-
POJ 1961(KMP)
主要思想见这篇博客: https://blog.youkuaiyun.com/qq_40679299/article/details/79837560#include<iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;const int N...原创 2018-04-10 01:28:30 · 263 阅读 · 0 评论 -
计蒜客 密码安全性进阶版 (不可重叠重复子串的个数)
可以枚举子串公共前缀长度进行求解#include<stdio.h>#include<algorithm>#include<cstring>#include<iostream>const int MAXN = 1e3+10;int r[MAXN]; // r 数组保存了字符串中的每个元素值,除最后一个元素外,每个元素的值在 1...原创 2018-08-31 22:25:47 · 255 阅读 · 0 评论 -
计蒜客 抄袭检测 (最长公共子串)
#include<stdio.h>#include<algorithm>#include<cstring>#include<iostream>const int MAXN = 2e5+10;int r[MAXN]; // r 数组保存了字符串中的每个元素值,除最后一个元素外,每个元素的值在 1..m 之间,最后一个元素的值为...原创 2018-08-31 23:01:31 · 395 阅读 · 0 评论 -
计蒜客 蒜厂工作手册 (ac自动机)
还是不很理解ac自动机的内涵,所以这道题卡住了,看了题解后恍然大悟。因为是字典树匹配,接着用两个栈,一个存字符串,另外一个存节点。这有什么用呢?原因是当找到一个单词的时候,就可以模拟删除这个单词,也就是从栈顶取出这个单词的所有字母跟节点序号。那么现在节点栈最顶端就是删除的这个单词的前一个字母的节点标号,再从这进行下一轮的匹配,当走完所有的字母就会发现字母栈中存储的正好就是删除剩...原创 2018-08-24 22:32:07 · 352 阅读 · 0 评论 -
马拉车算法
很好的一篇博客直接上模板:#include <bits/stdc++.h>using namespace std;const int maxn=110000*2+100;char s1[maxn],s2[maxn];int Len[maxn];int init(int len){ s2[0]='@'; s2[1]='#'; for(i...原创 2018-08-29 07:57:32 · 544 阅读 · 0 评论 -
POJ 3415 长度不小于k的公共子串个数(可以相同)
看了两小时,看得我有点蒙,终于看懂了。单调栈维护,非常神奇。首先,height[i]-k+1 很好理解把,他是说明目前这对后缀中不小于k的公共子串个数。题解说用单调栈维护,为什么要用单调栈维护呢?因为时间复杂的可以大大降低。怎么个降低方法呢?在之前学习lcp(就是height数组)的时候,肯定接触过这样一个问题,就是从i开始的后缀字符串跟从j开始的后缀字符串的最长公共...原创 2018-09-01 11:06:45 · 574 阅读 · 0 评论 -
UVA - 11475 回文串问题(KMP/后缀数组)
参考博客KMP 做法:由于只能在末尾添加字符所以可以用反过来的串和原串进行匹配,看看最后能匹配多次就是最长后缀回文的长度了#include<bits/stdc++.h>using namespace std;const int maxn=1e6+21;int nxt[maxn];void getnext(string pattern, int len)...原创 2018-09-05 07:33:57 · 187 阅读 · 0 评论 -
POJ 3693 (重复次数最多连续重复子串)
上边写了个大致思路,然后看了kuangbin的博客,深入的了解了一下怎么做。只是还得注意一些地方:设目前询问的长度为K, 则答案显然为K / L + 1, 但这不一定是最好的。拿一组例子来说:xbcabcab因为要达到n*logn的复杂度,所以外循环模拟长度,内循环模拟从第几个位置开始,但每次加的都是L所以会造成什么影响呢,看上边那个字符串:你会发现当L=3的时候...原创 2018-09-02 22:04:08 · 681 阅读 · 0 评论 -
URAL - 1297 最长回文子串
穷举每一位,然后计算以这个字符为中心的最长回文子串。注意这里要分两种情况,一是回文子串的长度为奇数,二是长度为偶数。两种情况都可以转化为求一个后缀和一个反过来写的后缀的最长公共前缀。具体的做法是:将整个字符串反过来写在原字符串后面,中间用一个特殊的字符隔开。这样就把问题变为了求这个新的字符串的某两个后缀的最长公共前缀。 #include <iostream>#incl...原创 2018-09-05 12:49:18 · 256 阅读 · 0 评论 -
POJ 3294 不小于k个字符串中的最长子串
将n个字符串连接起来,中间用没有出现过的字符隔开,然后求后缀数组,二分答案,进行分组,判断每组的后缀是否出现在不小于k的原串中。#include<cstdio>#include<algorithm>#include<cstring>const int MAXN = 1e5+1e3;int r[MAXN]; // r 数组保存了字符串中的每个元素...原创 2018-09-03 14:46:23 · 433 阅读 · 0 评论 -
SPOJ - PHRASES 每个字符串至少出现两次且不重叠的最长子串
#include<cstdio>#include<algorithm>#include<cstring>using namespace std;const int MAXN = 1e5+50;int r[MAXN]; // r 数组保存了字符串中的每个元素值,除最后一个元素外,每个元素的值在 1..m 之间,最后一个元素的值为 0int ...原创 2018-09-03 15:49:04 · 450 阅读 · 0 评论 -
POJ 1226 出现或者反转后出现在每个字符串中的最长子串
#include<cstdio>#include<algorithm>#include<cstring>using namespace std;const int MAXN = 1e5;int r[MAXN]; // r 数组保存了字符串中的每个元素值,除最后一个元素外,每个元素的值在 1..m 之间,最后一个元素的值为 0int wa[...原创 2018-09-03 16:57:27 · 312 阅读 · 0 评论 -
POJ 3450 所有字符串中最长公共子串
做法跟POJ 3294类似,不再详细说了,就是二分答案。#include<cstdio>#include<algorithm>#include<cstring>const int MAXN = 805000;int r[MAXN]; // r 数组保存了字符串中的每个元素值,除最后一个元素外,每个元素的值在 1..m 之间,最后一个元素的值为 ...原创 2018-09-06 14:41:49 · 207 阅读 · 0 评论 -
HDU - 6194 string string string (后缀数组)
题意:告诉你一个字符串和k , 求这个字符串中有多少不同的子串恰好出现了k 次。思路:肯定先考虑出现了K次的情况,显然是截取长度为K的一段后缀,根据lcp 数组,可以计算得到有多少个后缀至少出现K次,注意是至少。那么就存在一个问题,就是出现大于K次的字符串也算进来了。有一个很巧妙的办法,就是查找出现K+1的字符串,所以就是sa[i-1] ~ sa[i + k - 1] 和 s...原创 2018-09-18 20:57:59 · 227 阅读 · 0 评论 -
POJ - 3691 DNA repair (AC自动机+DP)
题意:(换了一种描述,其实是一样的题)分析:首先对与这种题的题问,可以很明显地感觉到DP因为很多模式串,所以考虑多模式匹配的AC自动机算法。首先考虑建立fail树,跟正常的ac自动机的fail树其实是一样的,只不过多了一个东西,就是对于这种情况:以下面这两个字符串建立fail树为例:CDABCDAB那么很显然第二个字符串中间的CD也是非法状态。所以对于建...原创 2019-09-27 22:47:18 · 535 阅读 · 0 评论 -
计蒜客 蒜头君传纸条进阶版(不同字串的个数)
#include<stdio.h>#include<algorithm>#include<cstring>#include<iostream>const int MAXN = 1e5+10;int r[MAXN]; // r 数组保存了字符串中的每个元素值,除最后一个元素外,每个元素的值在 1..m 之间,最后一个元素的...原创 2018-08-31 21:11:29 · 189 阅读 · 0 评论 -
计蒜客 新年礼物 (trie+exkmp+dp)
刚开始拿上这道题,没有一点思路,看了提示,说kmp处理前后缀,才恍然大悟,加上dp处理结果,妙哉。 #include<bits/stdc++.h>using namespace std;const int MAX_N = 2e6+10; // Trie 树上的最大结点数const int MAX_C = 26; // 每个结点的子结点个数上限...原创 2018-08-24 17:53:45 · 209 阅读 · 0 评论 -
POJ 2752(KMP)
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;int next[400005];int a[400005];void get_next(string t){ int j=-1; int i...原创 2018-04-10 02:20:04 · 214 阅读 · 0 评论 -
POJ 2752
给出若干个key 再给出若干个借口; 如果哪个借口中含有的key最多,则输出。思路: 用map将每一个key进行映射,再从每一个借口中找到与之相对应的单词,如果存在,则cnt++,然后输出cnt最大的那个句子。#include<iostream>#include<cstdio>#include<cstring>#include<algo...原创 2018-04-11 15:40:12 · 176 阅读 · 0 评论 -
POJ 2406(KMP变形)
举个例子可以看出来,比如abcabcabcabc ,next[len]=9,所以len-next[len]肯定是len的约数,并且此时len-next[len]也肯定为最短循环节。 也可以这么想,如果可以整除,那么肯定存在最短循环节,因为如果能整除你那么肯定前缀跟后缀字符串存在重叠,并且可以分为n个一样的子字符串,自己可以在纸上画一画。 #include&lt;iostream&gt...原创 2018-04-06 22:22:47 · 1130 阅读 · 0 评论 -
HDU2222 (ac自动机)(模板)
推荐博客https://blog.youkuaiyun.com/creatorx/article/details/71100840#include &amp;lt;iostream&amp;gt;#include &amp;lt;cstring&amp;gt;#include&amp;lt;cstdio&amp;gt;#include&amp;lt;string&amp;gt;#i原创 2018-05-10 14:52:49 · 151 阅读 · 0 评论 -
扩展KMP算法(详解+代码)
参考链接:扩展KMP#include&amp;amp;lt;cstdio&amp;amp;gt;#include&amp;amp;lt;cstring&amp;amp;gt;#include&amp;amp;lt;algorithm&amp;amp;gt;using namespace std;const int maxn=9999;int Next[maxn],extand[maxn];原创 2018-06-07 14:52:06 · 363 阅读 · 0 评论 -
后缀数组(基数排序)
不理解后缀数组的童鞋,可以看看挑战程序设计书上讲的,非常好,不过那上面讲的使是用sort进行的排序,效率较基数排序低。不过思想一样,那上面看懂了看这个很快。说三点:(1)y[]数组表示按照第二关键字排号的情况,目前里面存的时第一关键字的值,比如 y[1]=4,表示第二关键字排在第1位上此时第一关键字为下标从4开始的子字符串。因此用基数排序,因为其相当稳定。(2)swap交换后,计算x...原创 2018-08-30 19:59:38 · 993 阅读 · 1 评论 -
POJ 1743 不可重重叠最长重复子串
题意: 分析:首先贴出这篇论文: 细节:对于本题,因为计算相似,且原子数列两个不能有重叠。所以两个子串之间必须差一个数。数字不能是负数,所以都加上一个一个数。#include<stdio.h>#include<algorithm>const int MAXN = 20010;int r[MAXN]; // r 数组保存了字符串中...原创 2018-08-31 08:15:34 · 323 阅读 · 0 评论 -
POJ 3261 最长k次重复子串
#include<stdio.h>#include<algorithm>const int MAXN = 20010;int r[MAXN]; // r 数组保存了字符串中的每个元素值,除最后一个元素外,每个元素的值在 1..m 之间,最后一个元素的值为 0int wa[MAXN], wb[MAXN], wv[MAXN], ws[MAXN]; // 这 ...原创 2018-08-31 09:34:02 · 250 阅读 · 0 评论 -
SPOJ 694.(不相同的子串的个数)
#include<stdio.h>#include<algorithm>#include<cstring>const int MAXN = 1010;int r[MAXN]; // r 数组保存了字符串中的每个元素值,除最后一个元素外,每个元素的值在 1..m 之间,最后一个元素的值为 0int wa[MAXN], wb[MAXN], wv[...原创 2018-08-31 10:47:31 · 285 阅读 · 0 评论 -
KMP算法(模板)
int next[maxn];void getnext(string pattern, int len){ int k=-1; next[0]=-1; for(int i=1;i&lt;len;i++) { //找寻模式串里面跟他相同的前坠串,如果找不到,k就一直向前跑,直到找到为止或者说k==-1; //k就相当于一个指针,找...原创 2018-03-16 23:53:37 · 184 阅读 · 0 评论 -
计蒜客 旋转数字 (kmp+exkmp)
首先得去重,怎么去重呢,刚开始想了好几种方法,都不太理想,后再才想明白,找重复的不就是找找循环节嘛,因为如果存在循环节,那么一定会造成重复,比如123123123,循环节是3,所以只需要循环数字三次即可,再多循环就会造成重复,那么问题就来了,怎么计算循环节呢?在学习kmp中,我们利用fail数组的功能,很容易计算得到循环节。证明我这就不了,只说下方法,就是s.size()-fail[s.s...原创 2018-08-24 14:57:35 · 310 阅读 · 2 评论 -
计蒜客 匹配格式 (exkmp)
正如提示所说,最大长度是n/3,所以直接从大到小枚举即可;#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=1e6+10;int Next[maxn];void getnext(char* t){ ...原创 2018-08-24 15:30:52 · 233 阅读 · 0 评论 -
字典树(入门)
const int MAX_N = 10000; // Trie 树上的最大结点数const int MAX_C = 26; // 每个结点的子结点个数上限struct Trie { int *ch[MAX_N]; // ch 保存了每个结点的 26 个可能的子结点编号,26 对应着 26 种小写字母,也就是说,插入的字符串全部由小写字母组成。初始...原创 2018-08-24 16:19:26 · 267 阅读 · 0 评论 -
POJ - 1699 Best Sequence (AC自动机+状压DP)
题意:给出n(n<=10)个串,每个串的长度小于等于20,计算覆盖所有串的最短串长度分析:对所有串建立fail树,那么可以发现其实是在fail树上计算一个覆盖所有节点的最短路,因为最多10个串,所以我么考虑状压DP表示到了当前状态为 i 的节点且一共走了 j 状态的串(第 k 个串走完的话标记 j 的第k位是1)那么也很容易得到状态转移方程,在树上bfs计算即可。...原创 2019-09-28 14:07:27 · 600 阅读 · 1 评论