
===字符串相关===
Loi_a
这个作者很懒,什么都没留下…
展开
-
bzoj 3670 动物园 KMP
KMP非常神,我们可以顺着fail数组把一个字符串所有前缀等于后缀的子串跑一边,而且顺序是从大到小。例如ababcccabab,fail11=4,fail4=2,fail2=0;对于这道题来说,我们可以顺着每一位的fail跑一遍(当然会T)求num数组,但是我们只要求出跑了多少次后,fail值等于0就可以了,上例sum[11]=sum[4]+1,sum在初始化的时候求出来。统计答案的时候,num[i原创 2016-10-14 20:07:22 · 406 阅读 · 0 评论 -
bzoj 3940 & 3942 KMP || AC自动机
3942题解: 定义f[i] 为S串以第i位结尾的后缀,最长可以是T串多长的前缀,这一个可以用KMP匹配。 可以用一个first数组记录i字符前一个未被匹配的位置是哪一个,当f[i]=len(T)时,就可以将最末尾的len(T)个字符匹配了。 3940只需要把KMP换为AC自动机就可以。3942:#include<cstdio>#include<cstring>#include<iostr原创 2017-04-15 07:15:27 · 493 阅读 · 0 评论 -
bzoj 2553 禁忌 AC自动机+期望DP
先考虑一个串A如何划分价值最大,只需要按照所有T串在A中匹配的右端点排个序贪心去选,也就是希望我在A中匹配i个禁忌串,最靠后的右端点应该尽量靠前。 在AC自动机上对应为:只要走到一个禁忌串的终止节点,就将它划分出一段,(这里的终止节点包括那些顺着fail指针能走到终止节点的点)。 可以设dp[ i ][ j ]为在AC自动机上走了i步,走到了j节点的概率。 dp[ i ] [ ch[j][k]原创 2017-04-15 06:57:08 · 628 阅读 · 0 评论 -
bzoj 1212 L语言 Trie+DP
f[ i ] 为串前i位能否被理解,单词长不超过10,所以f[ i ]可以暴力转移……#include<cstdio>#include<cstring>#include<iostream>#define maxn 205using namespace std;char s[1500005];struct Trie{ int val[maxn]; int ch[maxn]原创 2017-04-15 06:36:23 · 529 阅读 · 0 评论 -
bzoj 4698 Sandy的卡片 后缀数组
可以把原序列转化为差分序列,题意就变成了求这n个差分序列的最长公共子串。然后就可以连成一串,用后缀数组做。二分一个答案,询问是否有连续n个后缀LCP>=mid而且首位所属的串不相同。#include<cstdio>#include<cstring>#include<iostream>#define maxn 1100005using namespace std;void read(int原创 2017-04-19 12:07:40 · 487 阅读 · 0 评论 -
bzoj 2938 病毒 AC自动机
在补全之后的AC自动机上顺着child找环而不经过终止节点,如果存在环,则说明我们可以顺着这条路径构造无限长的字符串。#include<queue>#include<cstdio>#include<cstring>#include<iostream>#define maxn 100005using namespace std;char s[maxn];struct Trie{原创 2017-04-13 18:42:01 · 643 阅读 · 0 评论 -
bzoj 1030 文本生成器 AC自动机+DP
答案=方案总数-不合法总数; 设AC自动机上非法节点为终止节点(或fail指针指向终止节点的点) dp[ i ] [ j ]为当前在AC自动机上跑了 i 步 ,跑到 j 节点的方案数,其中过程不经过非法节点。 不合法方案数=sigma(dp[ m ] [ i ])其中 i 不是为合法节点。#include<queue>#include<cstdio>#include<cstring>#i原创 2017-04-13 18:36:04 · 396 阅读 · 0 评论 -
bzoj 2434 阿狸的打字机 AC自动机+fail树
询问x串在y串中出现次数,就是有多少y串的节点能顺着fail边跑到x的终止节点。所以建出fail树,求end[x] 为根的子树中有多少y的节点。 这个可以离线询问,用树状数组维护。#include<queue>#include<vector>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#de原创 2017-04-13 17:31:46 · 423 阅读 · 0 评论 -
bzoj 3238 ahoi2013差异 后缀数组
#include<set>#include<cmath>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define maxn 500005#define LL long longusing namespace std;char s[maxn];set<int> S;set<int>原创 2017-03-17 23:18:32 · 341 阅读 · 0 评论 -
poj 3261 Milk Patterns 后缀数组+二分
题意是求可以重复的出现次数超过k次的子串,最长是多少。 样例输入 8 2 1 2 3 2 3 2 3 1 输出 4二分验证是否有连续的k-1个height大于所验证的答案。#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#define SZ 20005using nam原创 2016-12-27 08:03:15 · 437 阅读 · 0 评论 -
tyvj1860 后缀数组 模板
注意常数优化(优化输出等)。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int MAXN=2e5+10;int n,sa[MAXN],tmp[MAXN],rank[MAXN],sec[MAXN],cnt[MAXN],height[MA原创 2016-12-26 17:19:44 · 416 阅读 · 0 评论 -
CTSC2014 企鹅QQ Hash模板
#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#define LL unsigned long longusing namespace std;LL Hash[30005];char s[30005][205];int n,L,k;int num(char c){ if(c>='原创 2016-11-17 07:32:03 · 500 阅读 · 0 评论 -
bzoj 3172 单词 AC自动机
fail 树:一个点只有一个fail指针,所以把fail边倒过来就变成了一个树的结构。一个字符串出现在其他串中,当它是其他串一个后缀的前缀,例如abc出现在aaabcdd中,当它是abcdd这个后缀的前缀。所以需要算一下有多少fail直接或间接指向它最后一个字母c(fail树中 c子孙的大小),就可以算出abc是多少个后缀的前缀,也就可以算出它在整个文本中出现了多少次。 AC自动机建完后,用栈存f原创 2016-10-16 19:13:43 · 527 阅读 · 0 评论 -
HDU 2222 Keywords Search AC自动机
存个模板。#include<iostream>#include<cstdio>#include<queue>#include<cstring>#define SZ 500005using namespace std;struct Trie{ int val[SZ],ch[SZ][30],tot; int fail[SZ],lst[SZ]; void insert(原创 2016-10-16 11:19:54 · 354 阅读 · 0 评论 -
KMP模板
#include<iostream>#include<cstdio>#include<cstring>using namespace std;char s1[1000005],s2[1000005];int fail[1000005];void init(int m){ fail[1]=0; for(int i=2;i<=m;i++) { int原创 2016-10-14 14:43:57 · 405 阅读 · 0 评论 -
bzoj 1031 字符加密 后缀数组
把整个前n-1个字符复制到字符串末尾,求个后缀数组搞就可以。#include<cstdio>#include<cstring>#include<iostream>#define maxn 200010using namespace std;char s[maxn];struct Suffix{ int sa[maxn],rank[maxn],height[maxn];原创 2017-04-25 16:19:13 · 638 阅读 · 2 评论