【POJ2778】 DNA Sequence 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: 14224 Accepted: 5486

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

题意:给你n个病毒,求m长度的正常DNA序列的个数;
思路:在trie树上的递推,二维数组表示路径的方案数,快速幂解;
从0的dp[0][i]的和;

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
long long  b[110][110];
int n,m;
char s[115];
int MOD=100000;
int  ans=0;
int flag[110];
int tot;
int nex[110];
long long   cc[110][110];
long long  ccc[110][110];
struct node{
        int ch[4];
}t[110];
int val(char s)
{
    if(s=='A') return 0;
    if(s=='C') return 1;
    if(s=='T') return 2;
    if(s=='G') return 3;
}
inline void insert(char s[])
{
//  cout<<"     "<<s[0]<<endl;
//  cout<<tot<<endl;
    int now=0;
        for(int i=0;s[i];i++)
        {
        int ii=val(s[i]);
//cout<<i<<endl;
                if(!t[now].ch[ii])
                {
                        t[now].ch[ii]=++tot;
                }
                now=t[now].ch[ii];
        }
  flag[now]=1;
}
queue<int> q;
inline void AC()
{
        for(int i=0;i<4;i++) if(t[0].ch[i]) q.push(t[0].ch[i]);
        while(!q.empty())
        {
                int now=q.front();
                q.pop();
                int next=nex[now];
                for(int i=0;i<4;i++)
                {
        //  if(now==3) cout<<t[3].ch[2]<<endl;
        //  if(now==4)   cout<<"     "<<t[now].ch[i]<<endl;
                        if(t[now].ch[i])
                        {   
                                nex[t[now].ch[i]]=t[next].ch[i];
                                flag[t[now].ch[i]]|=flag[t[next].ch[i]];
                q.push(t[now].ch[i]);
                        }
                        else t[now].ch[i]=t[next].ch[i];
                }
        }
}
inline void ma_cheng(long long a[110][110],long long  tmp[110][110])
{
        for(int i=0;i<=tot;i++)
        for(int j=0;j<=tot;j++)
    {
        cc[i][j]=0;
        for(int k=0;k<=tot;k++)
            {
                    cc[i][j]+=a[i][k]*tmp[k][j];
                    cc[i][j]%=MOD;
            }

    }

//  for(int i=0;i<=5;i++)
    //{
    //for(int j=0;j<=5;j++)
    //cout<<cc[i][j]<<"   ";
    //cout<<endl;
    //}
//cout<<endl;

        for(int i=0;i<=tot;i++)
        for(int j=0;j<=tot;j++)
    {
        tmp[i][j]=cc[i][j];
    }
}
inline void ma_mi(int x)
{
    for(int i=0;i<=tot;i++)
    for(int j=0;j<=tot;j++)
    ccc[i][j]=b[i][j];
        while(x>0)
        {
//  cout<<"   "<<x<<endl;
                if(x&1) ma_cheng(ccc,b);
                ma_cheng(ccc,ccc);
                x>>=1;
        }
}
int main()
{
        scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        {
                scanf("%s",s);
                insert(s);
        }
        AC();
    //cout<<tot<<endl;
        for(int i=0;i<=tot;i++)
        if(!flag[i])
        {
                for(int j=0;j<4;j++)
                if(!flag[t[i].ch[j]])
                {
                        b[i][t[i].ch[j]]++;
                }
        }
//  cout<<tot<<endl;
    //for(int i=0;i<=7;i++)
//{

    //for(int j=0;j<=7;j++)
    //cout<<b[i][j]<<"   ";
//cout<<endl;
//}
        ma_mi(m-1);
    ans=0;
        for(int i=0;i<=tot;i++)
        if(!flag[i])
        {
                ans+=b[0][i];
        ans%=MOD;
        }
        cout<<ans<<endl;
}
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. 阅读详情

相关推荐

计算机视觉(相机标定;内参;外参;畸变系数)

目录 一、预备知识 1、坐标系变换过程(相机成像过程) (1)相机坐标系转换为图像坐标系(透视投影变换遵循的是针孔成像原理) (2)齐次坐标的引入原因:(为什么引入齐次坐标???) 2、内参与外参矩阵的构成 3、畸变参数 二、相机标定 1、张正友标定法(光学标定)及其求解思路 2、求解内参矩阵与外参矩阵的思路: (1)计算内参与外参矩阵的乘积M (2)求解内参矩阵A (3)求解外参矩阵(R1 R2 T) 三、参数优化 1、L-M算法 2、相机标定步骤 四、相关代码及其实验结.

QYJ_WORKHARDING的博客 6万+

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

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

idemor的博客 942

Windows11安装UE4+Airsim

Windows11安装UE4+Airsim

Legendyyy的博客 3743

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

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

morejarphone~ 416

浪涌电流测试仪的工作原理

浪涌电流脉冲形成的开始由同步电路 13 确定,该同步电路 13 发送命令以打开和第二开关 10 和 11,向发生器 14 发送控制命令以生成被测半导体器件 5 的控制信号和参考信号整形器 9 的触发脉冲。电流源的功率输出并联连接,以对流经被测半导体样品的电流求和。此外,使用数字控制扩展了测试仪的功能,能够产生各种形状的电流脉冲,例如梯形电流脉冲,以估计被测晶闸管的导通状态扩展时间。由于晶体管3的栅极是连接的,并且平衡电阻4包含在晶体管3的源中,因此通过每个晶体管3的电流脉冲大致相同,并重复参考信号的形状。

Jesse0257的博客 1255

人工智能的未来:从弱 AI 到通用人工智能(AGI)

从最初的简单自动化程序,到如今的深度学习大模型(如 ChatGPT、DeepSeek、Grok),AI 逐步从弱人工智能(Weak AI)向更智能、更自主的方向发展。AI 的发展将影响就业市场,取代重复性、低技能的工作,同时创造新的高技能岗位。尽管深度学习带来了巨大的进步,但它仍然依赖大量标注数据进行训练,对新环境的泛化能力有限,这也是当前 AI 迈向 AGI 的关键障碍之一。本文将探讨 AI 从弱 AI 进化到 AGI 的可能性,分析目前 AI 技术的局限性,并展望未来 AI 在各个行业的影响。

qq_20245171的博客 1万+

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

高分六号GF-6 WFV数据处理全流程:从原始数据解压到经纬度投影转换

本文详细解析了高分六号GF-6 WFV遥感数据的完整处理流程。从原始数据解压与分块结构理解入手,指导如何安装ENVI国产卫星支持工具进行自动拼接,并重点阐述了利用RPC模型进行正射校正以消除几何畸变,以及将UTM投影转换为地理经纬度坐标的关键步骤。文章旨在帮助用户高效地将原始卫星数据转化为可直接用于农业监测、生态环境分析等领域的标准地理空间图像。

weixin_29047919的博客 195

POJ 2778 DNA Sequence

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

wly1127的博客 365

Win11下Android模拟器报HAXM未安装?三步搞定虚拟化配置(附终端命令)

本文详细解析了Win11下Android模拟器HAXM报错的解决方案,从虚拟化配置到终端命令实战。通过检查BIOS设置、调整Windows功能及执行PowerShell命令,三步搞定虚拟化配置问题,有效提升模拟器性能。特别针对Win11与HAXM的兼容性问题提供了专业指导。

weixin_29215815的博客 143

【知识点总结】电路原理 第一讲

大家好,从今天起,我将开始更新自上大学以来所学到的各种知识,之所以选择更新它们是因为最近我一直在收拾整理自己自上大学以来所收获到的各种知识,看着那厚厚一沓的书本心里不由得犯愁。如果我想找到特定的知识,那岂不是得翻到猴年马月。俗话说得好,下雨天打鞋子,闲着也是闲着,为此我设置一个专栏,将知识点一一分类总结,目的在于更好的整理所学的知识。本人学艺不精,有一些知识点地方可能存在瑕疵,希望各位大佬可以多多指教。以下是本篇文章正文内容虚断:一般通用性运算放大器的正反向输入端之间的电阻非常非常的大。

weixin_51130221的博客 4万+

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

题目 给你一个m,一个n, m个要被禁止的模式串, 问长度恰为n的串里, 不包含任意一个模式串的方案数是多少 方案数模10W 思路来源 https://blog.youkuaiyun.com/morgan_xww/article/details/7834801(思路,强烈推荐,博主好文) https://blog.youkuaiyun.com/u013446688/article/details/4737...

小衣同学的博客 375

漏洞挖掘之工具配置

本文主要讲解burp工具的插件安装。

qq_64775230的博客 3273

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

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

怀旧版电脑GBC模拟器

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

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

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

Crazy_Bear 707

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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

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

zhmeng 224

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Poj 2778 DNA Sequence AC自动机+矩阵快速幂

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

J. Cole 428

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

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

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

poj-2778 DNA Sequence[AC自动机+矩阵快速幂]

题目地址 因为n很大,很自然想到用矩阵快速幂。 首先要知道对于一个01矩阵,如果m[i, j] = 1,表示从i到j有一条路,那么这个矩阵在自乘n次后,m[i,j]表示从i->j走n步的的方案数(离散书上的图论相关内容) 所以只需要找到哪些边是可以走的,然后跑一下矩阵快速幂就行了。 先把病毒放到ac自动机里面,对于结尾的节点标记一下,然后把可以走的边放到矩阵里面跑一下矩阵快速幂就行了。 #i...

qq_39921637的博客 164

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的博客 895

POJ2778 DNA Sequence 题解(AC自动机+矩阵快速幂)

算法:AC自动机 + 矩阵快速幂

Foliciatarier的博客 993

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...

菜鸡的博客 423

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

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

smilestruggler_Fly To Higher 328

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

DNA Sequence Time Limit:1000MS Memory Limit:65536K Total Submissions:14426 Accepted:5572 Description It's well known that DNA Sequence is a sequence only conta...

diaocuiguo2493的博客 116

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

题目链接:http://poj.org/problem?id=2778 TLE: 1.计算矩阵大小请根据具体具体节点数,直接按最大矩阵算会超时 2.取模操作在每一行完成之后再做 解题思路: 我们首先要知道矩阵快速幂可以应用于这样一个场景: 询问一个有n个节点的图,从节点x走k步到节点y有多少种方法? 构造n*n的矩阵,把所有的边都加到矩阵,比如(i,j)有两条边,a[i][j] =2...

shadiao.的博客 182
上一篇: 【hdu 2296】 Ring AC-自动机+DP
下一篇: BestCoder Round #74
ALPS233
博客等级 码龄11年 25粉丝 191原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值