poj2778.DNA Sequence (Trie图 && 矩阵乘)

poj 2778 DNA Sequence(AC自动机+矩阵快速幂) 题目链接:poj 2778 DNA Sequence 题目大意:给定一些含有疾病的DNA序列,现在给定DNA长度,问有多少种不同的DNA序列是健康的。 解题思路:对DNA片段建立AC自动机,因为最多10个串,每个串最长为10,所以最多可能有100个节点,在长度为n时 以每个节点终止的健康字符串个数形成一个状态集,通过AC自动机形成的边可以推导出n+1的状态集,走到单词节点是 阅读详情

有一些病毒串,求长度为 L 的且不包含任意一个病毒串的字符串数量。

首先多串匹配,所以要建立 Trie 图(AC自动机)。而 L 很大,我们需要一个 O(log n) 的算法。考虑要得到一个长度为 n 的字符串,也就是在 Trie 图上走了 n 步。是不是似曾相识,很自然地就能想到矩阵乘法:首先根据 Trie图 求出 mat[ i ][ j ] ,表示从 i 节点到 j 节点走一步能到达的方案数(当然 i, j 都不能是病毒节点),然后计算这个矩阵的 n 次方,求和就能得到答案。

#include <cstdio>
#include <cstring>

using namespace std;

const int MAX_N = 105;
const int mod = 100000;

struct Trie {
	int ch[4], ed, fl;
} t[MAX_N];
int n, m, sz = 0;
char s[15];

int get_num(char c)
{
	if (c == 'A') return 0;
	if (c == 'C') return 1;
	if (c == 'T') return 2;
	if (c == 'G') return 3;
}

void insert()
{
	int u = 0, l = strlen(s + 1);
	for (int i = 1; i <= l; i ++) {
		int c = get_num(s[i]);
		if (!t[u].ch[c]) t[u].ch[c] = ++ sz;
		u = t[u].ch[c];
	}
	t[u].ed = 1;
}

void init()
{
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i ++)
		scanf("%s", s + 1), 
		insert();	
}

int q[100005];

void get_dna()
{
	int hd = 0, tl = 0;
	t[0].fl = 0;
	for (int c = 0; c < 4; c ++)
		if (t[0].ch[c]) {
			t[t[0].ch[c]].fl = 0;
			q[++ tl] = t[0].ch[c];
		}
	while (hd < tl) {
		int r = q[++ hd];
		for (int c = 0; c < 4; c ++) {
			if (!t[r].ch[c]) {
				t[r].ch[c] = t[t[r].fl].ch[c];
				continue;
			}
			q[++ tl] = t[r].ch[c];
			int u = t[r].ch[c], v = t[r].fl;
			while (v && !t[v].ch[c]) v = t[v].fl;
			t[u].fl = t[v].ch[c];
			if (t[t[u].fl].ed) t[u].ed = 1;
		}
	}
}

struct Matrix {
	long long mt[105][105];
}a;

Matrix operator*(Matrix a, Matrix b)
{
	Matrix c;
	for (int i = 0; i <= sz; i ++)
		for (int j = 0; j <= sz; j ++) {
			c.mt[i][j] = 0;
			for (int k = 0; k <= sz; k ++) 
				c.mt[i][j] = (c.mt[i][j] + a.mt[i][k] * b.mt[k][j]) % mod;
		}
	return c;
}

Matrix operator^(Matrix a, int k)
{
	Matrix ret;
	for (int i = 0; i <= sz; i ++) {
		for (int j = 0; j <= sz; j ++)
			if (i == j) ret.mt[i][j] = 1;
			else ret.mt[i][j] = 0;
	}
	while (k) {
		if (k & 1) ret = ret * a;
		a = a * a;
		k >>= 1;
	}
	return ret;
}

void doit()
{
	get_dna();
	for (int i = 0; i <= sz; i ++)
		for (int j = 0; j < 4; j ++)
			if (!t[i].ed && !t[t[i].ch[j]].ed)
				a.mt[i][t[i].ch[j]] ++;
	a = a ^ m;
	long long ans = 0;
	for (int i = 0; i <= sz; i ++)
		ans = (ans + a.mt[0][i]) % mod;
	printf("%I64d\n", ans);
}

int main()
{
	init();
	doit();
	return 0;
}


DNA Sequence POJ - 2778(AC自动机+矩阵快速幂) It’s well known that DNA Sequence is a sequence only contains A, C, T and G, and it’s very useful to analyze a segment of DNA Sequence,For example, if a animal’s DNA sequence contains segment ATC then it may mean that the animal may have a genetic disease. 阅读详情

相关推荐

从TTL到RS485:一颗CH342芯片搞定三种串口通信的硬件连接实战

本文详细介绍了CH342芯片在TTL、RS232和RS485三种串口通信模式下的硬件连接实战。通过精选的电路设计示例和配置技巧,展示了CH342在工业控制和智能硬件开发中的灵活应用,帮助开发者高效实现多协议通信,显著提升项目开发效率。

weixin_30709061的博客 509

POJ 2778(AC自动机+矩阵快速幂)

        非常有趣的一道题,题目给m个病毒串,问不包含病毒串的长度n的DNA片段有几个。         用病毒串构造AC自动机,用fail指针跑出字符串状态间的到达关系和危险点,危险点即到达即代表某串含有病毒的点。         用AC自动机构造出矩阵,初始矩阵中的mat[i][j]表示i点走一步到达j点的方法,由于危险点不可到达所以危险点的行和列为0。例如初始有0-&gt;1的1种...

idemor的博客 942

AI原生应用评测:主流大语言模型性能对比

任务适配性:是否匹配应用的核心任务(如代码生成需强逻辑推理,内容创作需强创意性);上下文能力:处理长序列(如10万+字文档)的理解与生成能力;可靠性:幻觉(Hallucination)率、事实准确性、安全合规性;性价比:API调用成本、延迟、 scalability(扩展能力)。AI原生应用的核心是LLM与应用场景的深度协同。

架构师的AI之路,分享AI应用开发架构的学习与实践。 507

【POJ No. 2778】DNA 序列 DNA Sequence

【POJ No. 2778】DNA 序列 DNA Sequence

代码改变世界 814

【C++】开源:ncurses终端TUI文本界面库

ncurses配置使用(TUI)

DevFrank的博客 3169

药物不良反应预测实战指南:从FAERS数据挖掘到PyTorch深度学习模型(含可解释性分析)

【代码】药物不良反应预测实战指南:从FAERS数据挖掘到PyTorch深度学习模型(含可解释性分析)

理论都是虚的,代码才是王道。 722

POJ 2778 (AC自动机 矩阵快速幂)

题目链接:点击这里题意:求不出现任意一个模式串的长度为m的文本串的数量.建立AC自动机,文本串生成的过程可以看成是在自动机上某一个节点往4个方向上走一步,因为不能出现模式串,所以不能走到模式串结尾的节点.所以可以建立矩阵,a[i][j]a[i][j]表示从节点i到节点j的方案数. 根据邻接矩阵的定义, 这个矩阵的m次就是从某一个点走m步到达另一个点的方案数, 统计下就好了.#include <cst

morejarphone~ 416

国社科“选题设计论证”部分不再难!用AI快速梳理五大核心板块,轻松撰写出高质量的基金申报书(附AI提示词)

七哥给大家推荐的高校都在用的AI平台——高级学术版专业应用平台,集成了ChatGPT、Claude、Gemini、Grok等Al大模型的PLUS版本平台,包括 ChatGPT-5、4o、o3、4.1、4.5、Gemini 2.5 Pro、Claude 3.7、Claude 4、DeepSeek 满血版、Grok 3 、Grok 4等原生线路,还有国际主流的GPTs学术应用,可以辅助大家高效完成科研和学术写作任务,当然撰写硕博论文,课题、职称论文、国社科、国自然基金本子也是手拿把掐。

智能AI让学术科研更容易 932

poj2778(ac自动机+矩阵快速幂)

HDU2778 题意 求长度为m且不包含n个子串的种类数. 思路 参考自这个博客. ac自动机+矩阵快速幂. 这儿有个结论. 给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数mod p的值 把给定的图转为邻接矩阵,即A(i,j)=1当且仅当存在一条边i->j。令C=A*A,那么C(i,j)=ΣA(i,k)*A(k,j), 实际上就等于从点i到点j恰好经过2条边的路径...

Do It Youself! 447

生成模型实战 | VQ-GAN(Vector Quantized-Generative Adversarial Network)

向量量化生成对抗网络 (Vector Quantized-Generative Adversarial Network, VQ-GAN) 结合了向量量化变分子自编码器 (VQ-VAE) 和生成对抗网络 (GAN) 的优势,通过向量量化 (Vector Quantised, VQ) 构建离散潜空间,结合感知损失与对抗损失,在保持语义一致性的同时能够生成纹理细节丰富的图像。在本节中,我们将详细解释 VQ-GAN 的技术原理和各个组成,并使用 PyTorch 从零开始实现 VQ-GAN。

盼小辉丶的博客 6704

RT-DETR改进策略【模型轻量化】| 替换骨干网络为 2024轻量化网络MoblieNetV4:移动生态系统的通用模型

本文记录的是基于MobileNet V4的RT-DETR目标检测轻量化改进方法研究。通过整合UIBMobile MQA以及优化的NAS策略能够在在不降低性能指标的前提下,降低计算成本。本文配置了原论文中和五种模型,以满足不同的需求。

Limiiiing的博客 1923

POJ 2778 DNA Sequence

题意:有m种DNA序列是有疾病的,问有多少种长度为n的DNA序列不包含任何一种有疾病的DNA序列。

wly1127的博客 366

AMBA-CHI协议详解(五)

 每个事务由许多不同的packets组成,这些数据包通过互连(interconnect)传输。packets内的一组ID域段用于提供有关包的附加信息。

Crazzy_M的博客 1964

poj 2778 DNA Sequence 【AC自动机 + 矩阵加速】

DNA Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13502   Accepted: 5143 Description It's well known that DNA Sequence is a sequence only contains

世界很大 1140

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

POJ2778 DNA Sequence Trie+矩阵乘法

题意:给定N个有A C G T组成的字符串,求长度为L的仅由A C G T组成的字符串中有多少个是不含给定的N个字符串的题解: 首先我们把所有的模式串(给定的DNA序列)建Trie,假定我们有一个匹配串,并且在匹配过程到S[i]这个字符时匹配到了Trie上的某个节点t,那么有两种可能: 匹配失败:t->child[S[i]]为空,跳转到t->fail,因此t->fa...

a18700013354的博客 114

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

DNA Sequence POJ - 2778 邻接矩阵 trie图 矩阵快速幂

首先构造trie图。 我们明确一点的是,给出trie图,那么所有点的转移方式都是唯一可以确定的。即使是没有这个字符,他也会指向根节点。 我们根据离散数学的知识可以知道。计算有向图的邻接矩阵,然后k次方,就能够计算出从某一个点到另一个点,有多少条长度为k的路径。 故,我们构造出来trie图,拿出该图的邻接矩阵,就能计算路径数目。–(注意改图是有向图)– trie图的构造不说了,模板。 邻接矩阵的构造...

weixin_44019404的博客 221

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

poj 2778 DNA Sequence

题目传送门 题意: 给出m个DNA序列,求出长度为n的不含上述序列的个数。(0 (1 题解: 首先我们应将DNA序列存入Tire中,之后可以构造一个矩阵A,A[i][j]表示从i节点状态是否可以一步转移到j节点状态。构造方法则很明显:沿着fail指针进行构造,如果它是被标记的序列那么就置为0。所以在BuildFail是要将没有儿子节点通过fail指针指向前面的节点。之后求出A^n求出方案

glk__'blog 505

POJ 2778 DNA Sequence【AC自动机+矩阵快速幂】

#include #include #include #include #include #include using namespace std; typedef long long ll; struct AC_Automata { #define Nn 102 #define M 4 int ch[Nn][M], val[Nn], f[Nn], last[

智障 3085

DNA Sequence POJ - 2778 ac自动机+矩阵快速幂

一、内容 It's well known that DNA Sequence is a sequence only contains A, C, T and G, and it's very useful to analyze a segment of DNA Sequence,For example, if a animal's DNA sequence contains segment ATC...

Tizzi的博客 896

poj2778 DNA Sequence

AC自动机,矩阵快速幂

Circus 553

[日常摸鱼]poj2778 DNA Sequence

这题太神啦 题意:求长度为$n$的不包含给定DNA序列的DNA序列个数,给定的不超过10个 构建出Trie图,用$danger[i]$来表示不能走到$i$,对于DNA序列结尾的结点$danger$设为1,构建$fail$指针的时候对于一个结点$i$的某个后缀如果$danger$为1那么$danger[i]$也应该为1. 然后根据Trie图再构造出对应的转移矩阵...

92

【POJ2778 DNA Sequence】AC自动机+Trie图 | 齐次马氏链 | 邻接矩阵快速幂 | fail链 | CGWR | N

【POJ 2778】DNA Sequence Time Limit: 1000MS&amp;amp;amp;amp;amp;amp;nbsp;&amp;amp;amp;amp;amp;amp;nbsp;&amp;amp;amp;amp;amp;amp;nbsp;&amp;amp;amp;amp;amp;amp;nbsp;Memory Limit: 65536K Total Submissions: 20275&amp;amp;amp;amp;amp;amp;

Keyu Tian's blog 241

POJ 2778 DNA Sequence(AC自动机+矩阵幂DP)

POJ 2778 DNA Sequence(AC自动机+矩阵) http://poj.org/problem?id=2778 题意:所有串只由A,C,T,G字符构成.给你m个模板串,然后给你一个n,问你长为n的由ACTG字符构成的字符串有多少个不包含任意一个模板串.其中n很大. 分析:本题类似于UVA11468: http://blog.csdn.net/u013480600/articl

code 1439
上一篇: POJ3691.DNA repair (Trie图 && DP)
下一篇: hdu2243.考研路茫茫——单词情结(Trie图 && 矩阵乘法)
ALXPCUN
博客等级 码龄11年 4粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值