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

UE5.6使用ndisplay,单窗口多画面(单机部署),配置、打包流程,无需switchboard 摘要:本文介绍了在UE5.6中使用ndisplay插件的完整流程。首先需要开启ndisplay和launch插件,创建ndisplay配置文件并设置本地单窗口多画面模式。随后通过Process Explorer获取启动命令用于制作bat文件。打包项目时需删除场景中的ndisplay文件,但保留内容浏览器中的配置,并设置为开发版打包。最后将ndisplay文件导出为.ndisplay格式,与bat文件一起放置在打包目录下,通过bat启动程序。注意修改路径和窗口大小时需保持纯英文路径,且bat代码需保持单行格式 阅读详情

DNA Sequence
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 12628 Accepted: 4818

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的合法串,假设已经确定了前k个,第k+1个的选择就取决于 前k个是否存在某个后缀是不合法子串的前缀。假设不合法子串是AT,前k个确定了是*****A(最后一个是A),那么第k+1个只能选择C\T\G三种。所以这题的关键是序列的不同后缀之间的状态转移。而字符串间状态的转移就是一个AC自动机状态转移的过程。比如刚刚的情况,假如第k+1个选择了C,那么后缀就是****AC了,这时候考虑AC是不是某个不合法串的前缀,发现不是,则继续考虑后缀C是不是不合法串的前缀,发现也不是则前面的后缀都不需要考虑了,回到初始状态。整个过程和AC自动机匹配字符串的过程是一样的。


#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <set>
using namespace std;

#define maxn 2010
#define mod 100000
typedef long long ll;
typedef vector<ll> vec;
typedef vector<vec> mat;
mat mul(mat &a, mat &b)
{
    mat c(a.size(), vec(b[0].size(),0));
    for(int i=0; i<a.size(); i++)
        for(int j=0; j<b.size(); j++)
        for(int k=0; k<b[0].size(); k++)
        c[i][k]=(c[i][k]+a[i][j]*b[j][k]%mod)%mod;

    return c;
}

int matrix[105][105];

mat pow(mat a, int n)
{
    mat ret(a.size(), vec(a.size(),0));
    for(int i=0; i<ret[0].size(); i++) ret[i][i]=1;

    while(n){
        if(n&1) ret=mul(ret, a);
        a=mul(a,a);
        n>>=1;
    }
    return ret;
}

struct Trie
{
    int next[maxn][4], fail[maxn], endd[maxn],tag[maxn];
    int root, L;
    int newnode()
    {
        for(int i=0; i<4; i++)
            next[L][i]=-1;
        endd[L++]=0;
        return L-1;
    }
    void init()
    {
        L=0;
        root=newnode();
    }

    void insert(char *buf)
    {
        int len=strlen(buf);
        int now=root;
        for(int i=0; i<len ; i++){
            if(next[now][buf[i]-'a']==-1)
                next[now][buf[i]-'a']=newnode();
            now=next[now][buf[i]-'a'];
        }
        endd[now]++;
    }
    int build()
    {
        memset(matrix, 0, sizeof(matrix));
        queue<int> que;
        fail[root]=root;
        int scnt=0;
        tag[root]=scnt++;
        for(int i=0; i<4; i++)
            if(next[root][i]==-1){
                next[root][i]=root;
                matrix[tag[root]][tag[root]]++;
            }
            else if(!endd[next[root][i]]){
                fail[next[root][i]]=root;
                tag[next[root][i]]=scnt++;  
                matrix[tag[root]][tag[next[root][i]]]++;
                que.push(next[root][i]);
            }

        while(!que.empty()){
            int now=que.front(); que.pop();
            for(int i=0; i<4; i++)
                if(next[now][i]==-1){
                    next[now][i]=next[fail[now]][i];
                    if(!endd[next[fail[now]][i]])   //注意后缀节点不合法,则该节点也不合法
                    matrix[tag[now]][tag[next[fail[now]][i]]]++;
                }
                else if(!endd[next[now][i]]){
                    int tmp=fail[next[now][i]]=next[fail[now]][i];
                    if(endd[tmp]){      //注意后缀节点不合法,则该节点也不合法。标记下传
                        endd[next[now][i]]=1;
                        continue;
                    }
                    tag[next[now][i]]=scnt++;
                    matrix[tag[now]][tag[next[now][i]]]++;
                    que.push(next[now][i]);
                }
        }

        return scnt;
    }

};

char buf[100];
void turn(char *buf)
{
    int len=strlen(buf);
    for(int i=0; i<len; i++){
        switch(buf[i])
        {
        case 'A':
            buf[i]='a';
            break;
        case 'G':
            buf[i]='b';
            break;
        case 'C':
            buf[i]='c';
            break;
        case 'T':
            buf[i]='d';
        }
    }
}
Trie trie;
int main()
{
    ll n,m;
    while(cin>>m>>n){
        trie.init();
        for(int i=0; i<m; i++){
            scanf("%s", buf);
            turn(buf);
            trie.insert(buf);
        }
        int scnt=trie.build();
        mat m(scnt, vec(scnt));
        for(int i=0; i<scnt; i++){
            for(int j=0; j<scnt; j++){
            m[i][j]=matrix[i][j];
          //  cout<<matrix[i][j]<<' ';
            }
           // cout<<endl;
        }

        m=pow(m, n);
        mat a(1, vec(scnt,0));
        a[0][0]=1;
        a=mul(a, m);
        ll ans=0;
        for(int i=0; i<a[0].size(); i++)
            ans =(ans+a[0][i])%mod;
        cout<<ans<<endl;

    }

    return 0;
}



YOLOv11改进 | 注意力篇 | YOLOv11引入CBAM注意力机制 我们的实验表明各种模型的分类和检测性能得到了一致的改进,证明了 CBAM 的广泛适用性。简单介绍:CBAM的主要思想是通过关注重要的特征并抑制不必要的特征来增强网络的表示能力。模块首先应用通道注意力,关注"重要的"特征,然后应用空间注意力,关注这些特征的"重要位置"。到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv11改进有效涨点专栏,本专栏目前为新开的,后期我会根据各种前沿顶会进行论文复现,也会对一些老的改进机制进行补充,如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~ 阅读详情

相关推荐

我每天如何使用 ChatGPT

我偶尔会用这个功能作为开始。我本人非常喜欢阅读,让 ChatGPT 来概括所有文章,感觉就像身处于但丁描述的地狱的某个层次那样痛苦。然而,有时一些文章实在是太啰嗦、无聊,或者写得让人不愉快(比如一个无趣记者对一个让人讨厌的人进行的漫无焦点的采访)。我需要获取这些文章中的一些信息,以便保持信息的更新和了解。在晚期资本主义的广告经济下,很多文章只在一个段落里提供新信息,其余都是无聊的填充内容,只是为了展示糟糕的广告,这实在是对人们的时间和生命的一种浪费。我有几次利用 ChatGPT 来。

KevinDai007的博客 3784

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

电容DAC版图布局中的对称艺术:从二维共质心到误差最小化

本文深入探讨了电容DAC版图布局中的对称艺术,重点介绍了二维共质心技术如何有效最小化误差。通过分析系统误差和随机误差的来源,详细解析了共质心布局的核心技术及优化策略,包括梯度误差补偿和寄生参数平衡方法。实战案例展示了该技术在12位SAR ADC设计中的应用效果,为高精度集成电路设计提供了重要参考。

weixin_29300241的博客 584

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

大致题意,与之前那道题目差不多,也是由指定的一些字母构成的字符串,不能够包换一些不合法的字符,再告诉你一个长度,问你一共有多少个合法的字符串。但不同的是,这道题目的长度可以很长。 上一道题目,我们介绍了用dp的方法去解决,但是这题面对这么长的长度,显然是不可取的。但是我们回顾一下上一道题目dp的过程,dp[i][j]表示到达AC自动机上的j点走了i步时的方案数,最后要求的是 Σdp[n][j],即到达每个合法点走了n步时的方案数总和。而在图论中,邻接矩阵的乘法、次方,恰好可以表示一个人在图中

alpc_qleonardo 563

Java电商秒杀系统性能优化(一)——电商秒杀系统框架回顾

电商秒杀系统框架回顾项目简介外部依赖框架回顾项目要点项目中存在的问题小结 课程是免费的,课程地址如下:SpringBoot搭建电商秒杀项目,课程真的很棒,作者的思路很清晰,建议各位读者可以跟着视频练习一下这个项目; 项目简介 通过SpringBoot快速搭建的前后端分离的电商基础秒杀项目。项目通过应用领域驱动型的分层模型设计方式去完成:用户otp注册、登陆、查看、商品列表、进入商品详情以及倒计时秒...

ghw15221836342的博客 3720

实战MSP-M0G3507与陶晶驰串口屏的通信协议解析

本文详细解析了MSP-M0G3507微控制器与陶晶驰串口屏的通信协议实现。内容涵盖串口配置、协议帧结构、数据校验机制及ASCII协议实战代码,重点介绍了陶晶驰串口屏的指令集应用和调试技巧,为嵌入式开发提供可靠的串口通信解决方案。

h9j8k7l6m5n的博客 867

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

#include #include #include #include using namespace std; typedef __int64 type; const int kind=4; //每个节点的子节点的个数上限 const int mod = 100000; const int size=109; //转移矩阵的行大小 class AC_auto { public:

Join Hands 2480

yolov8 转华为昇腾om脚本

yolov8 转华为昇腾om脚本

jacke121的专栏 1602

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

断断续续看了一周AC自动机和Trie图,总算明白一些了,A的不易啊 /* * ===================================================================================== * * Filename: 2778.cpp * Version: 1.0 * Created

__夜 1071

自适应滤波-----LMS(Least Mean Square)算法

自适应滤波的意义所在 自适应滤波器解决非平稳的过程,因为实际信号的统计特性可能是非平稳的或者是未知的。 自适应滤波器的特点: 1.没有关于待提取信息的先验统计知识 2.直接利用观测数据依据某种判据在观测过程中不断递归更新 3.最优化 自适应滤波分类: 处理器的结构划分:横向结构、格型结构 重复一次计算自适应需要的数据划分:成批处理法、递归处理法 按调节算法...

heda3的博客 10万+

《Python星球日记》 第72天:问答系统与信息检索

《Python星球日记》 第72天:问答系统与信息检索,在前面的日子里,我们学习了自然语言处理的基础知识,包括文本预处理、词向量、Transformer架构和各种预训练模型。今天,我们将探索问答系统这一NLP的重要应用,以及如何结合信息检索技术构建智能问答系统。

Code_流苏:在代码中寻诗意,在实践中觅真知 1075

poj 2778 ac自动机dp矩阵快速幂

链接http://poj.org/problem?id=2778 题解参考:http://blog.youkuaiyun.com/morgan_xww/article/details/7834801 ch

kdh的专栏 713

红米K70至尊版修复“nv损坏”主板电阻图示 mtk芯片工程固件刷写与步骤说明

💝💝💝红米K70至尊版 机型代码:rothko,搭载天玑9300+旗舰芯片.后置5000万像素索尼IMX906高动态OIS主摄,800万像素超广角镜头,200万像素微距镜头,前置2000万像素摄像头,也适用于以下型号的小米机型:2407FPN8EG,2407FPN8ER,XIG06,A402XM,2407FRK8EC。 💝💝💝通过博文了解 1💝💝💝-----此机型工程固件的资源刷写注意事项 2💝💝💝-----此机型刷写工程固件预览界面 3💝💝💝------红米K

小马哥的专栏 1461

POJ2778 DNA Sequence AC自动机+DP+矩阵快速幂

Problem Address:http://poj.org/problem?id=2778【前言】这道题算是出自Trie主题的。算是一道比较综合的题目。【思路】(1)首先用所给的字符串构造出一个AC自动机。          这一步很简单的,也不多说了。          注意

Human_CK的专栏 914

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

100道动态规划——28 POJ 2778 DNA Sequence AC自动机+DP+矩阵快速幂 很不错嘛

一眼看出是AC自动机上的DP,因为数据量的问题显然不能记忆化搜索或者是递推,然后就不知道怎么做了         天知道还要联系到矩阵快速幂,图论的东西好久都没写过了=_=         定义一个Matrix的数据结构,也就是矩阵,由矩阵的长、宽、以及每个分量上的元素描述而成,支持通常意义上的矩阵乘法(在具体实现的时候用的是稀疏矩阵乘法),此外拥有一个成员函数qpow(int n),返回值为

Sion 792

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

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

lajiyuan的博客 192

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

POJ 2778 L - DNA Sequence (AC自动机 dp 矩阵快速幂)

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

dengyan1183的博客 138

poj 2778 DNA Sequence (ac自动机+矩阵快速幂优化dp)

题目:http://poj.org/problem?id=2778 题意:给出N段DNA序列(仅由‘A’,'T','G','C'四种字符组成),求一段长为L的DNA序列不包含前面给出的任何DNA序列的方案数。 分析:将N个字符串建成ac自动机,然后把所有禁止走的位置标记出来,然后利用ac自动机建二维矩阵Matrix[][],Matrix[u][v]表示节点u走一步到节点v的路径数。然后

w20810的专栏 578

POJ 2778 DNA Sequence ( AC自动机、Trie图、矩阵快速幂、DP )

题意 : 给出一些病毒串,问你由ATGC构成的长度为 n 且不包含这些病毒串的个数有多少个 分析 : 这题搞了我真特么久啊,首先你需要知道的前置技能包括 AC自动机、构建Trie图、矩阵快速幂,其中矩阵快速幂和AC自动机可能都熟悉,但是这题为什么和矩阵有关系?Trie图是什么呢?好像只听说过Trie树啊!下面我慢慢展开,首先声明本人水平实在实在有限,理解错误的地方请批评指证,万分感激! ...

weixin_30526593的博客 104

poj 2778 DNA Sequence 【ac自动机 + dp + 矩阵快速幂】

这题基本上是纯模版,开始wa了,然后和模版对照了一下,居然是建fail指针的时候搞错了。。。少写了一个q.push(to) #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace st

量子流逝 875

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

AC自动机+矩阵快速幂经典题,

Enmity_Dark 761

AC自动机+DP(POJ2778&&POJ3691)

AC自动机+DP傻X题

蜜の夜明け 632

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.youkuaiyun.com/u013480600/articl

code 1439

POJ 2778 (AC自动机+矩阵乘法)

POJ 2778 DNA Sequence Problem : 给m个只含有(A,G,C,T)的模式串(m <= 10, len <=10), 询问所有长度为n的只含有(A,G,C,T)的串中有多少个不含有模式串的串。(n<=2000000000) Solution :首先对所有模式串建立AC自动机。然后dp[i][j]表示长度为i,走到AC自动机的节点j这样的字符串满...

aekijekzn484879763的博客 169

主席树(可持久化线段树)入门专题

1.poj 2104 查询区间第k小。 主席树其实相当于建立了n棵线段树,第i棵线段树是根据区间【1,i】按值建立的。对于每一棵线段树我们记录它对应的区间每个数出现的次数,所以首先要对所有的数离散化。 先考虑最简单的情况,只查询【1,n】的第k小,对于【1,n】我们按值建立一棵线段树,对于a[i]我们在位置a[i]上加1。查询第k小那么先看左子区间出现了多少个数cnt,假设左区间出现的数cnt

写东西的地方 6180
上一篇: hdu 2222 ac自动机模板题
下一篇: poj 1816 Trie+DFS匹配模式串
HuanTongH
博客等级 码龄12年 7粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值