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

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

Description

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. Until now scientists have found several those segments, the problem is how many kinds of DNA sequences of a species don't contain those segments. 

Suppose that DNA sequences of a species is a sequence that consist of A, C, T and G,and the length of sequences is a given integer n. 

Input

First line contains two integer m (0 <= m <= 10), n (1 <= n <=2000000000). Here, m is the number of genetic disease segment, and n is the length of sequences. 

Next m lines each line contain a DNA genetic disease segment, and length of these segments is not larger than 10. 

Output

An integer, the number of DNA sequences, mod 100000.

Sample Input

4 3
AT
AC
AG
AA

Sample Output

36

Source

POJ Monthly--2006.03.26,dodo


题目链接:

http://poj.org/problem?id=2778


题目大意:

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


解题思路:

        首先根据给出的序列构造ac自动机,自动机的每个节点是一种状态,在序列末尾添加一个字符就是一次状态转移。这样这道题就是要在每个序列末尾的节点做上标记,然后求在自动机上进行n次状态转移且不经过任何标记的方法数。

        我们将自动机看作一个有向图,问题转化为求从节点a到节点b经过n个节点的方法数。我们得到该有向图的邻接矩阵,求邻接矩阵的n次幂mat,mat[a][b]即为答案。


AC代码:

import java.util.*;

public class Main {
	static int n,ct;
	static long m,mod=100000,ans;
	static int[] mp=new int[305];
	static int[] mm=new int[105];
	static int[] ff=new int[105];
	static int[][] ch=new int[105][4];
	static long[][] bb=new long[105][105];
	static long[][] xx=new long[105][105];
	static long[][] res=new long[105][105];
	static Queue<Integer> q=new LinkedList<Integer>();
	static void clear(int u)
	{
		ch[u][0]=ch[u][1]=ch[u][2]=ch[u][3]=0;
	}
	static void insert(char[] s)
	{
		int u=0,a;
		for(int i=0;i<s.length;i++)
		{
			a=mp[s[i]];
			if(ch[u][a]==0)
			{
				ch[u][a]=++ct;
				clear(ct);
			}
			u=ch[u][a];
		}
		mm[u]=1;
	}
	static void build()
	{
		q.clear();int u,v,r;
		for(int i=0;i<4;i++)
		{
			u=ch[0][i];
			if(u>0) { q.add(u);ff[u]=0;}
		}
		while(!q.isEmpty())
		{
			r=q.poll();v=ff[r];
			if(mm[v]==1) mm[r]=1;
			for(int i=0;i<4;i++)
			{
				u=ch[r][i];
				if(u==0) ch[r][i]=ch[v][i];
				else { ff[u]=ch[v][i];q.add(u);}
			}
		}
	}
	static void get_mat()
	{
		for(int i=0;i<=ct;i++)
		{
			for(int j=0;j<=ct;j++)
				xx[i][j]=0;
			for(int j=0;j<4;j++)
				if(mm[ch[i][j]]==0) xx[i][ch[i][j]]++;
		}
	}
	static void mul_mat(long[][] xx,long[][] yy)
	{
		for(int i=0;i<=ct;i++)
		for(int j=0;j<=ct;j++)
		{
			bb[i][j]=0;
			for(int k=0;k<=ct;k++)
				bb[i][j]=(bb[i][j]+xx[i][k]*yy[k][j]%mod)%mod;
		}
		for(int i=0;i<=ct;i++)
		for(int j=0;j<=ct;j++)
			xx[i][j]=bb[i][j];
	}
	static void pow_mat(long n)
	{
		for(int i=0;i<=ct;i++)
		{
			for(int j=0;j<=ct;j++)
				res[i][j]=0;
			res[i][i]=1;
		}
		while(n>0)
		{
			if((n&1)>0) mul_mat(res,xx);
			mul_mat(xx,xx);n>>=1;
		}
	}

	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		mp['A']=0;mp['T']=1;
		mp['C']=2;mp['G']=3;
		while(in.hasNext())
		{
			n=in.nextInt();m=in.nextLong();
			clear(0);ct=0;
			Arrays.fill(mm,0);
			for(int i=1;i<=n;i++)
				insert(in.next().toCharArray());
			build();
			get_mat();pow_mat(m);
			ans=0;
			for(int i=0;i<=ct;i++)
				ans=(ans+res[0][i])%mod;
			System.out.println(ans);
		}
	}
}


POJ2778 矩阵快速幂 + AC自动机 题意:给定A C G T 四种字符,给定长度n 问你长度为n的只包含这四种字符串 不包含模式串的数量有多少 ,给出m个有这四种字符组成的模式串 给定n的数量为2e9级别,所以对于一次O(n)也无法解决,普通的遍历肯定不可行。长度为n的字符串,我们可知即是在trie树上经过(转移)n个节点获得的一个字符串,而要想这个字符串不包含我们之前给出的模式串,即等同于我们用给定的模式串构造一棵trie然后求解从根节点出发不经过模式串结尾节点的方法数有几种 离散数学中有结论是在一个图中求一个点i到另一个点j可达关系,只需 阅读详情

相关推荐

把MinerU集成到Dify

本文介绍了如何将本地部署的MinerU与Dify平台进行集成。首先需要确保Dify和MinerU在Docker环境中正常运行,并通过配置虚拟网络实现互联。然后详细说明了在Dify平台安装MinerU插件的步骤,包括从插件市场搜索安装、配置连接参数等关键操作。特别强调了要等待MinerU容器完全启动(healthy状态)后再进行Dify配置,否则会出现连接错误。通过简单的URL指向和API密钥设置,用户即可实现Dify平台与本地MinerU算力网络的对接,为后续的AI应用开发提供基础支持。

lyxerlau的博客 314

AC自动机专题——G - 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

你那么爱笑,家里人知道吗? 526

SICK LMS111激光雷达数据解析实战:从原始帧到三维点云的完整流程

本文详细解析了SICK LMS111激光雷达从原始数据帧到三维点云的完整处理流程,包括数据帧结构解析、坐标转换、点云可视化及性能优化技巧。通过实战代码示例,展示了如何高效处理激光雷达数据,并应用于动态物体检测、地面分割等工业场景,为AGV和服务机器人开发者提供实用指南。

garlic的博客 769

AC自动机+矩阵快速幂

POJ 2778 DNA序列题意:给n条病毒DNA序列,然后问所有长度为L的DNA序列中,不包含病毒的序列有多少条。分析:首先将病毒的DNA序列建AC自动机,然后建fail指针。将每个点编号作为状态,然后可以得每个点走一步后的状态,然后长度为L,相当于走了L步,矩阵快速幂即可。举个栗子 比如病毒是{AC,C} 图好难画啊,边就不连了。。 从0点,到0的方式有2个(G,T),到1的方式有1个(A

bllsll 754

别再只画GO图了!用R语言+Perl脚本搞定单细胞KEGG富集分析与圈图(附完整代码)

本文详细介绍了如何利用R语言和Perl脚本实现单细胞KEGG富集分析全流程,从基因ID转换到专业圈图可视化。通过对比KEGG与GO分析的互补价值,提供完整的代码实现和优化技巧,帮助研究者高效完成单细胞测序数据的通路分析,并生成高质量的圈图展示结果。

weixin_28694169的博客 405

TIFF文件渲染避坑指南:Three.js与Cesium的5个关键差异点

本文深入对比了Three.js与Cesium在渲染TIFF文件时的5个核心差异点,包括坐标系处理、内存管理、着色器系统、性能优化策略和错误处理机制。重点解析了Cesium的全球WGS84坐标系与Three.js局部坐标系对地理空间数据渲染的根本影响,并提供了针对性的性能优化与调试方案,帮助开发者根据项目需求选择合适的3D引擎并有效避坑。

weixin_29243279的博客 334

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

传送门 题面: DNA Sequence Time Limit:1000MS Memory Limit:65536K Total Submissions:19507 Accepted:7431 Description It's well known that DNA Sequence is a sequence on...

weixin_30901729的博客 304

18、Excel VBA编程:自定义函数创建与代码调试全攻略

本文详细介绍了Excel VBA中自定义函数的创建方法,以获取单元格注释为例演示了完整开发流程,并深入讲解了代码调试的重要性与核心工具。内容涵盖三种主要错误类型及其应对策略,系统介绍了调试工具栏、断点、逐行执行、Locals窗口、Immediate窗口等实用功能。通过综合案例展示了如何运用调试技术解决实际问题,并总结了提前规划、逐步测试、日志记录等最佳实践,帮助读者提升VBA编程效率与代码质量。

life6的博客 101

AI智能体记忆平台Cognee:从知识图谱到向量检索的工程实践

在人工智能领域,记忆系统是智能体实现持续学习和个性化交互的核心基础设施。其技术原理基于将非结构化对话信息转化为结构化知识表示,通常通过命名实体识别、关系抽取和嵌入向量化等技术实现。这种结构化记忆的价值在于使AI能够理解上下文历史,实现长期规划和个性化服务,从而从简单的工具进化为真正的智能伙伴。在实际应用场景中,记忆平台需要处理多模态数据的存储与索引,平衡语义检索与元数据过滤,并解决记忆更新与冲突消解等工程挑战。本文以开源项目Cognee为例,深入探讨了如何通过知识图谱和向量数据库构建智能体的持久记忆能力,为

weixin_30764771的博客 500

【零基础入门unity游戏开发——unity3D篇】unity CharacterController 3D角色控制器最详细的使用介绍,并实现俯视角、第三人称角色控制(附项目源码)

【unity小技巧】unity最完美的CharacterController 3d角色控制器,实现移动、跳跃、下蹲、奔跑、上下坡、物理碰撞效果,复制粘贴即用但是我发现很多人还是不理解,都跑来私信问我,所以决定重新做一个更加详细且简单控制器,主要是实现俯视角和第三人称角色控制。添加一个胶囊体,添加Character Controller组件,记得删除Capsule Collider组件,因为Character Controller自带了碰撞,所以不需要Character Controller参数介绍。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 5022

Ubuntu24.04安装搜狗输入法详细教程

本章教程,介绍如何在Ubuntu24.04版本操作系统上安装搜狗输入法。

猿小白的博客 1万+

【POJ 2778】DNA Sequence 中文题意&题解&代码(C++)

ac自动机+dp+矩阵加速

曾经追梦的happy时光 1095

【CAD】【手把手带你写一个DXF&JAVA解析框架】02——整理DXF元数据实体类,涵盖重要属性与对照组码

本文系统梳理了DXF文件解析中的核心元数据类,重点分析了Tables段(图层、块记录)、Blocks段和Entities段的关键数据结构。通过详细的组码说明和对照代码实现,阐述了图层定义(DXFLayer)、块记录(DXFBlockRecord)、应用程序标识(DXFAppId)等表对象的属性构成;同时解析了直线(DXFLine)、多段线(DXFLwPolyLine)、圆弧(DXFArc)、文字(DXFText)等实体类的几何特征与属性定义。文章还构建了顶点(Vertex)、基类(DXFEntity、DXF

Wonder ZH 270

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

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

POJ2778-AC自动机,矩阵快速幂优化DP

POJ2778 题目描述 简要题意:给出mmm个病毒串,问你由ATGCATGCATGC构成的长度为 nnn 且不包含这些病毒串的字符串有多少个? 题解 定义dp[i][j]=dp[当前长度为i][当前在AC自动机的第j个节点]=方案数dp[i][j]=dp[当前长度为i][当前在AC自动机的第j个节点]=方案数dp[i][j]=dp[当前长度为i][当前在AC自动机的第j个节点]=方案数. 转移方程也十分简单. 但是注意到nnn的大小,显然会T到飞起,考虑矩阵乘法优化,其实再转化一下题意就是:全图中的000

Daniel__d的博客 301

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

poj 2778 AC自动机 + 矩阵快速幂

// poj 2778 AC自动机 + 矩阵快速幂 // // 题目链接: // // http://poj.org/problem?id=2778 // // 解题思路: // // 建立AC自动机,确定状态之间的关系,构造出,走一步 // 能到达的状态矩阵,然后进行n次乘法,就可以得到状态间 // 走n步的方法数. // 精髓: // 1):这个ac自动机有一些特别,根节点是为空串,

TIMELIMITE的专栏 924

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

POJ 2778 DNA Sequence AC自动机 + 可达矩阵 + 矩阵快速幂

题目链接: http://poj.org/problem?id=2778代码:#include <cstdio> #include <iostream> #include <cstring> #include <queue> #define sf scanf #define pf printf //#define LOCAL using namespace std; typedef long lon

SolarDomo的博客 505

[POJ 2778] DNA Sequence (AC自动机+trie图+矩阵快速幂)

链接POJ 2778题意给出一些关键词,问长度为n的不含有这些关键词中任何一个的字符串有多少个。 关键词和字符串均由’A’、’C’、’T’、’G’四个字符构成。题解一道关于trie图的题目。首先补充一个关于“矩阵和有向图”的知识: 现在有一个有向图含有n个点,可以用一个n*n的邻接矩阵代表该图节点间的关系。现在问你从i节点到j节点走k步,有多少种走法。 事实上我们算出该矩阵的k次幂矩阵gk,g

mysterious 339

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

题目链接 哇哇哇!!!过啦,美滋滋,捋了半天题意,不解为何最后答案为0,然后就一直一直的debug,后来发现竟然是在写字典树的时候写彪了……呜呜呜,好气啊QAQ…… 题目的思路倒也却是很有奥妙,也特别的有意思(尤其是想到之后),我们看到有长达"2e9"的步数得去走,就想到了用矩阵快速幂,[i][j]指的是从i到j所需要的路径可能的数量。然后,我们找到N步之后的所有从[0]状态到达的全体...

既然弱小,就只顾变强就是了 311

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

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

题目链接:http://poj.org/problem?id=2778   题目大意:   给出m个字符串,求长度为n且不包含给出字符串的字符串个数   题目思路:   推荐博客:传送门   这道题一共分为两步,第一步是得到字典树上每个节点走一步到达各个节点的合法方案数(起点和终点不能为非法节点,非法节点的定义下面介绍),这个方案数通过矩阵存储,第i行第j列表示从i节点表示的状...

smilestruggler_Fly To Higher 328

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

题意有M个字符串,这M个字符串不能出现在字符串中。要求字符串长度为N,问有多少种方案。题解首先,对于这道题,需要知道一个数学定理。对于一张图的邻接矩阵,邻接矩阵的N次幂就是两点距离为N的路径条数。 知道了上述定理以后,这道题就可以看作,字典树从0开始,到某个节点,路径长度为N的方案个数。因为存在不能出现的字符串,结合AC自动机便可解决该题。利用AC自动机对不能出现的字符串,以及后缀子串是不能出现的

zhenlingcn的博客 413

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

题意 传送门 POJ 2778 题解 初始化 ACACAC 自动机,将 TrieTrieTrie 树上节点看做字符串的状态(字符串后缀模式),显然各节点有 A,C,G,TA,C,G,TA,C,G,T 四种状态可以转移(对应了 DNADNADNA 序列在末尾添加一个字符),且转移后节点依然在 TrieTrieTrie 树上。 判断一个状态是否具有疾病基因,只要判断对应节点或节点的失配节点(即其后缀)是否对应了疾病基因即可。 构造矩阵,维度为 TrieTrieTrie 节点数,即字符串可能的状态数,mat[i]

neweryyy的博客 146

poj2778 DNA Sequence(AC自动机+矩阵快速幂)

题目链接:点击打开链接 题意描述:给m字符串,这m个字符串是带有病毒的DNA。然后问一个长度为n的字符串不带有任何病毒有多少中可能?所有字符串之后ACGT这几个字符串组成 解题思路:AC自动机+矩阵快速幂 前置内容:邻接矩阵幂的含义:点击打开链接 分析:首先根据题意先建一个AC自动机,其实AC自动机本身就是一张图,AC自动机中的每个结点就相当于图中的顶点,每个转移A、C、G、T就相

Crazy_Bear 708

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

DNA Sequence 传送门。 这题搞了我几个小时。先睡了,回头补博客。 题意:传送门 AC自动机学习博客:传送门 矩阵快速幂学习:队友wqqq的模板 AC自动机模板:bin巨板子胡改 矩阵快速幂模板:结合网友+小破站up #include<cstdio> #include<queue> #include<cstring> #include<al...

zhmeng 225

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

POJ2778 本题题意是给你一个字符集和一个长度m,还有一些敏感串,求出字符集构造出的长度为m的字符串中不包含敏感串的串的个数。 我们用到AC自动机的性质,想象一下如果从len=k向len=k+1转移,AC自动机上每个状态之间有多少种转移方法,就可以构造出对应的转移矩阵,再利用矩阵快速幂就可以求解。在构造转移矩阵的时候,要注意如果某串的后缀是敏感串,也是不可以转移的。 转移矩阵TnTnT^...

lajiyuan的博客 192
上一篇: HDU-5893 树链剖分+区间合并
下一篇: Nachos操作系统课设 浅谈优先级调度
AC_Machine
博客等级 码龄11年 1粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值