[POJ2778]DNA Sequence(AC自动机 + DP + 矩阵优化)
AC自动机加DP就不说了
注意到 m <= 10,所以模式串很少。
而 n 很大就需要 log 的算法,很容易想到矩阵。
但是该怎么构建?
还是矩阵 A(i,j) = ∑A(i,k) * A(k,j),那么i到j的方案数就是j到k的方案数称k到j的方案数,那么直接矩阵快速幂即可
#include <queue>
#include <cstdio>
#include <cstring>
#define N 100001
#define p 100000
#define LL long long int n, m, cnt, ans;
int next[N][4], fail[N], f[101][N];
bool val[N];
char s[N];
std::queue <int> q; struct Matrix
{
int n, m;
LL a[141][141];
Matrix()
{
n = m = 0;
memset(a, 0, sizeof(a));
}
}res; inline int idx(char x)
{
if(x == 'A') return 0;
if(x == 'C') return 1;
if(x == 'T') return 2;
if(x == 'G') return 3;
} inline void insert()
{
int i, x, now = 0, len = strlen(s + 1);
for(i = 1; i <= len; i++)
{
x = idx(s[i]);
if(!next[now][x])
next[now][x] = ++cnt;
now = next[now][x];
}
val[now] = 1;
} inline void make_fail()
{
int i, now;
for(i = 0; i < 4; i++)
if(next[0][i])
q.push(next[0][i]);
while(!q.empty())
{
now = q.front();
q.pop();
for(i = 0; i < 4; i++)
{
if(!next[now][i])
{
next[now][i] = next[fail[now]][i];
continue;
}
fail[next[now][i]] = next[fail[now]][i];
val[next[now][i]] |= val[next[fail[now]][i]];
q.push(next[now][i]);
}
}
} inline Matrix operator * (Matrix x, Matrix y)
{
int i, j, k;
Matrix ret;
ret.n = x.n;
ret.m = y.m;
for(i = 0; i <= x.n; i++)
for(j = 0; j <= y.m; j++)
for(k = 0; k <= y.n; k++)
ret.a[i][j] = (ret.a[i][j] + x.a[i][k] * y.a[k][j]) % p;
return ret;
} inline Matrix operator ^ (Matrix x, int y)
{
int i;
Matrix ret;
res.n = ret.m = cnt;
for(i = 0; i <= cnt; i++) ret.a[i][i] = 1;
for(; y; y >>= 1)
{
if(y & 1) ret = ret * x;
x = x * x;
}
return ret;
} int main()
{
int i, j, k;
scanf("%d %d", &n, &m);
for(i = 1; i <= n; i++)
{
scanf("%s", s + 1);
insert();
}
make_fail();
res.n = res.m = cnt;
for(i = 0; i <= cnt; i++)
{
if(val[i]) continue;
for(j = 0; j < 4; j++)
if(!val[next[i][j]])
res.a[i][next[i][j]]++;
}
res = res ^ m;
for(i = 0; i <= cnt; i++)
ans = (ans + res.a[0][i]) % p;
printf("%d\n", ans);
return 0;
}
[POJ2778]DNA Sequence(AC自动机 + DP + 矩阵优化)的更多相关文章
- poj 2778 DNA Sequence AC自动机DP 矩阵优化
DNA Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11860 Accepted: 4527 Des ...
- [poj2778 DNA Sequence]AC自动机,矩阵快速幂
题意:给一些字符串的集合S和整数n,求满足 长度为n 只含charset = {'A'.'T‘.'G'.'C'}包含的字符 不包含S中任一字符串 的字符串的种类数. 思路:首先对S建立ac自动机,考虑 ...
- POJ 2778 DNA Sequence (AC自动机+DP+矩阵)
题意:给定一些串,然后让你构造出一个长度为 m 的串,并且不包含以上串,问你有多少个. 析:很明显,如果 m 小的话 ,直接可以用DP来解决,但是 m 太大了,我们可以认为是在AC自动机图中,根据离散 ...
- [poj2778]DNA Sequence(AC自动机+矩阵快速幂)
题意:有m种DNA序列是有疾病的,问有多少种长度为n的DNA序列不包含任何一种有疾病的DNA序列.(仅含A,T,C,G四个字符) 解题关键:AC自动机,实际上就是一个状态转移图,注意能少取模就少取模, ...
- POJ2778 DNA Sequence(AC自动机 矩阵)
先使用AC自动机求得状态转移关系,再建立矩阵,mat[i][j]表示一步可从i到j且i,j节点均非终止字符的方案数,则此矩阵的n次方表示n步从i,到j的方法数. #include<cstdio& ...
- poj2778 DNA Sequence(AC自动机+矩阵快速幂)
Description It's well known that DNA Sequence is a sequence only contains A, C, T and G, and it's ve ...
- 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂
[题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...
- POJ2278 DNA Sequence —— AC自动机 + 矩阵优化
题目链接:https://vjudge.net/problem/POJ-2778 DNA Sequence Time Limit: 1000MS Memory Limit: 65536K Tota ...
- POJ 2778 DNA Sequence ( AC自动机、Trie图、矩阵快速幂、DP )
题意 : 给出一些病毒串,问你由ATGC构成的长度为 n 且不包含这些病毒串的个数有多少个 分析 : 这题搞了我真特么久啊,首先你需要知道的前置技能包括 AC自动机.构建Trie图.矩阵快速幂,其中矩 ...
随机推荐
- Oracle Flashback Technology【闪回技术】
-------------------------与其他数据库相比,Oracle的闪回让开发者多了一条选择的路. Flashback的目的 先看下Oracle官方文档中的解释: Oracle Flas ...
- Hdoj—1789
//大意理解 先排序 最早交的里面选最大值 扫描完了加没写的 排序后 应该是早交的和扣分多的在前 用结构体吧/*#include<stdio.h>#include<stdio.h&g ...
- PLSQL练习-数据共享与整合技术
1.编写一个存储过程,根据输入的工作类型,输出该工作的平均工资. 命令如下: 创建存储过程: create or replace procedure avgsal(v_job in emp.job%t ...
- Java中的线程--线程中的工具
这主要想写一下Java中的jdk提供的一些线程中的工具, 一.semaphore信号灯 Semaphore可以维护当前访问自身的线程个数,并提供了同步机制,使用Semaphore可以控制同时访问资源的 ...
- Java中的线程--线程范围内共享数据
接着学习Java中的线程,线程范围内的共享数据! 一.线程范围内的数据共享定义 对于相同的程序代码,多个模块在同一个线程中共享一份数据,而在另外线程中运行时又共享另外一份数据. 共享数据中存在的问题, ...
- HTML5触摸事件
touchstart .touchmove .touchend 事件 touchstart事件:当手指触摸屏幕时触发,即使有一个手指放在屏幕上也会触发. touchmove事件:当手指在屏幕上滑动时触 ...
- 167. Two Sum II - Input array is sorted@python
Given an array of integers that is already sorted in ascending order, find two numbers such that the ...
- (61)zabbix网络发现规则配置实战/详解
开始配置.首先,我们需要定义发现规则,用于扫描.步骤如下 第一步 Configuration >>Discovery>>Create rule,编辑网络发现规则 如上配置,za ...
- (31)zabbix Aggregate checks聚合检测
概述 aggregate checks是一个聚合的检测,例如我想知道某个组的host负载平均值,硬盘剩余总量,或者某几台机器的这些数据,简单的说,这个方法就是用来了解一个整体水平,而不需要我们一台台看 ...
- Python9-面对对象2-day23
#计算正方形的周长和面积 class Square: def __init__(self,side_len): self.side_len = side_len def perimeter(self) ...