AC自动机
morejarphone
这个作者很懒,什么都没留下…
展开
-
HDU 2896 (AC自动机)
题目链接:点击这里题意:对于每一个网站找出含有的所有的病毒串,最后输出含有病毒串的网站个数.把每个病毒串加入到自动机里,然后每次判断一个网站的时候遍历一次,为了去重开一个数组标记下就好了.坑点:1.字符个数有点多,我开128爆内存了,实际上前面ASCLL码前20个是不需要的;2.注意病毒有重复的.#include <bits/stdc++.h>using namespace std;#defin原创 2016-06-14 23:32:01 · 262 阅读 · 0 评论 -
HDU 3695 (AC自动机)
题目链接:点击这里题意:求文本串中出现的模式串个数。模式串反着出现也算。把模式串正反都扔进自动机,节点开一个vector存下来所有的以这个节点结尾的模式串,然后扫一遍就行了。注意正反算一种trick:q不是只有一位#include <cstdio>#include <cmath>#include <algorithm>#include <iostream>#include <vector>原创 2016-08-08 14:54:12 · 320 阅读 · 0 评论 -
HDU 2222 (AC自动机 板子题)
题目链接:点击这里AC自动机板子题#include <bits/stdc++.h>using namespace std;#define maxn 511111#define maxm 1111111struct trie { int next[maxn][26], fail[maxn], end[maxn]; int root, cnt; int new_node (原创 2016-06-14 22:34:36 · 382 阅读 · 0 评论 -
HDU 4511 (AC自动机 DP)
题目链接:点击这里题意:给定n个点的坐标, 每次只能从一个点走到编号比他大的点. 求一条最短的路径, 并且这条路径上不能有给出的子路径.把这些子路径插进AC自动机里, 然后用dp[i][j]dp[i][j]表示在图上的ii, 字典树上的jj的最短路径, 转移方程就是dp[i][j]=min{dp[p[k]+dis(p,i)∣∣next[k][i]=j}dp[i][j]=min\left\{dp[p[原创 2016-06-17 18:12:34 · 578 阅读 · 0 评论 -
HDU 3341 (AC自动机 DP)
题目链接:点击这里题意:给出n个DNA模式串, 和一个文本串, 调整文本串字符的顺序使得所有模式串出现的次数和最多.因为四种字符出现的次数都有限, 可以用类似于进制的做法记录字符出现的状态, 如果四个字符的总数有aa, bb, cc, dd, 当前状态出现的次数是xx, yy, zz, kk, 那么状态就记录为x×(b+1)×(c+1)×(d+1)+y×(c+1)×(d+1)+z×(d+1)+k×1原创 2016-06-17 16:31:47 · 544 阅读 · 0 评论 -
HDU 2457 (AC自动机 DP)
题目链接:点击这里题意:给定一个DNA串, 至少改变多少字母才能使得所有的模式串都不出现在这个DNA串里.先给所有的模式串建立AC自动机,然后DNA串就不能走到自动机上的危险节点, 也就是模式串的结尾节点. 假设dp[i][j]dp[i][j]表示在字典树上i节点, DNA串长为j的最小改变个数, 转移就是d[i][j]=min{dp[k][j−1]dp[k][j−1]+1buf[k]=buf[i+原创 2016-06-17 12:30:12 · 343 阅读 · 0 评论 -
HDU 2825 (AC自动机 状压DP)
题目链接:点击这里题意:给定m个单词的集合, 求长度为n的串中, 至少出现k个集合中的单词的串有多少个.设dp[i][j][k]dp[i][j][k]表示在字典树的ii节点上, 单词的出现状态为jj, 串的长度为kk的方案数, 沿着字典树就容易搞出状态方程 dp[i][j][k]=dp[next[i][id]][j|state][k+1](0≤x≤26)dp[i][j][k]=dp[next[i][原创 2016-06-16 23:21:47 · 318 阅读 · 0 评论 -
HDU 2243 (AC自动机 矩阵快速幂)
题目链接:点击这里题意:求所有长度在LL之内的出现至少一种模式串的文本串个数. 对2642^{64}取模.对2642^{64}取模可以简单的看成无符号64位整数的自然溢出, 然后就可以忽略取模了. 和这题类似. 求出所有不存在模式串的文本串然后减一下就好了.先用AC自动机插入所有的文本串, 然后就在自动机上走找所有的不存在模式串的文本串, 建立矩阵AA, 因为是长度小于等于LL, 所以要求出A1+A原创 2016-06-16 20:12:05 · 467 阅读 · 0 评论 -
POJ 2778 (AC自动机 矩阵快速幂)
题目链接:点击这里题意:求不出现任意一个模式串的长度为m的文本串的数量.建立AC自动机,文本串生成的过程可以看成是在自动机上某一个节点往4个方向上走一步,因为不能出现模式串,所以不能走到模式串结尾的节点.所以可以建立矩阵,a[i][j]a[i][j]表示从节点i到节点j的方案数. 根据邻接矩阵的定义, 这个矩阵的m次就是从某一个点走m步到达另一个点的方案数, 统计下就好了.#include <cst原创 2016-06-16 16:46:54 · 307 阅读 · 0 评论 -
HDU 5384 (AC自动机)
题目链接:点击这里题意:给出n个文本串和m个模式串,求每一个文本串中出现的模式串次数总和。给m个模式串建AC自动机,然后每一个文本串询问一次就好了。#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <cmath>#include <iostream>#include <str原创 2016-06-16 10:27:15 · 390 阅读 · 0 评论 -
UVALive 4670 (AC自动机)
题目链接:点击这里题意:按照顺序输出在文本串中出现的次数最多的模式串.水题,直接跑AC自动机,记录每一个模式串的次数就好了.#include <bits/stdc++.h>using namespace std;#define maxn 511111#define maxm 1111111char str[155][77];int n;char a[maxm];struct trie {原创 2016-06-15 10:51:17 · 275 阅读 · 0 评论 -
HDU 3065 (AC自动机)
题目链接:点击这里题意:需要统计每一个单词在文本中出现的次数没有重复的单词,直接拿来跑自动机就好.#include <bits/stdc++.h>using namespace std;#define maxn 51111#define maxm 2111111int n, m;char str[1111][55];char a[maxm];struct trie { int n原创 2016-06-15 10:03:13 · 258 阅读 · 0 评论 -
Kattis taboo (AC自动机 拓扑排序 DP)
题目链接:点击这里题意:给出n个01串,要构造一个最长的串使得这个串不包含所有出现过的串,无解输出-1.首先把所有的点扔进自动机,因为出现过的串不能在我们构造的串中出现,所以事先把某些”坏点”标记,坏点指的就是每个串的结束节点以及沿着结束节点fail指针走下去的节点. 如果剩下的图中能够沿着根走出一个环那么必然就无解了, 判环可以用一遍拓扑确定. 排除无解情况剩下就是一个DAG了, 用dp[i][j原创 2016-11-17 20:18:26 · 1000 阅读 · 0 评论