玄武密码 给若干模式串和一个文本串.求每个模式串在文本串上能匹配的最大前缀长度. N<=10^7,M<=10^5,每一段文字的长度<=100. jklover的题解 将模式串建成一个 AC 自动机,匹配文本串的时候往前暴力跳,跳到第一个合法的位置即可. 时间复杂度:线性. co int N=1e7+1,S=4; int n,m; int len[N]; namespace AC { int idx; int id(char x) { switch(x) { case 'E': retur…
对所有询问串建立AC自动机. 然后将母串在AC自动机上跑,每走到一个点x,从x点出发沿着fail指针能到的所有前缀都是匹配成功的,暴力向上走,碰到走过的就break,这样每个点最多只会被标记一次. 时间复杂度$O(N+100M)$. #include<cstdio> #include<cstring> const int N=10000003,M=100010; int tot,son[N][4],f[N],fail[N],q[N];bool v[N]; int n,m,i,fin…
题目链接:BZOJ - 1559 题目分析 将给定的串建成AC自动机,然后在AC自动机上状压DP. 转移边就是Father -> Son 或 Now -> Fail. f[i][j][k] ,表示到了字符串第 i 位,在AC自动机的第 j 个节点上,状态为 k 的方案数. 状态 k 是一个二进制压缩的,表示已经包含了哪些给定串的整数. 然后...输出方案....这个太麻烦了...我是从最后状态DFS向前反推. 另外的问题是我写的AC自动机DP无法正确处理给定串存在串 A 包含串 B 的情况,所…
SAM裸题.这道题卡空间.要小心数组别开炸了. #include<cstdio> #include<cstring> typedef long long ll; const int maxn = 2e7+20; int par[maxn],mx[maxn],tr[maxn][4]; int cnt=1,last=1; inline int change (char ch) { if(ch=='E') return 0; else if(ch=='S') return 1; else…