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

85-Halcon-- gen_cam_par_area_scan_division 函数功能(生成面阵相机镜头参数) Halcon的gen_cam_par_area_scan_division算子用于生成面阵相机的镜头参数,支持除法畸变模型。该算子输出包含9个参数的元组,包括焦距(Focus)、畸变系数(Kappa)、像素尺寸(Sx,Sy)、主点坐标(Cx,Cy)和图像尺寸。文中详细解析了各参数含义、数学原理(包括畸变矫正公式和坐标转换),并提供了三个工业应用案例:高精度芯片尺寸测量、机器人焊接引导和大视野汽车表面检测。最后给出了完整的相机标定流程,涵盖参数生成、畸变校正和标定配置步骤,适用于工业视觉系统的精确标定需求。 阅读详情

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;
}



14、5G物理层的灵活解决方案:广义频分复用(GFDM) 广义频分复用(GFDM)作为一种高度灵活的5G物理层多载波调制方案,能够满足多样化应用场景的需求,包括高吞吐量的比特管道通信、低功耗高连接数的物联网、超低延迟的触觉互联网以及广覆盖的无线区域网。通过参数化配置,GFDM可适配LTE资源网格,实现与现有系统的兼容与共存。其支持多种解调方式、干扰消除技术、OQAM映射及预编码机制,兼具低带外发射、高频谱效率和强鲁棒性。GFDM还能统一描述OFDM、FBMC、FTN等多种经典与先进波形,成为5G及未来通信系统中极具潜力的通用波形框架。 阅读详情

相关推荐

BSW: Dcm模块配置--28服务

这个章节讲解下UDS中的28服务(Communcation Control)的配置,顾名思义,对当前ECU的通讯状态进行变更,主要设置应用报文,网络管理报文的收发控制,通常应用在刷写APP软件时,降低总线负载。这里首先要提醒的一点是,28服务几乎不需要手写代码,只有在客户需求要求前置条件不满足时报特定NRC时才需要填充代码。实际配置中主要涉及的模块有DCM,BSWM,ComM,RTE.2.BswM模块的配置。3.ComM模块的配置。1.DCM模块的配置。

Forever_Oct的博客 3086

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

使用SSE流式输出(Javaweb前后端实战)

SSE(Server-Sent Events)是一种在Web应用中实现单向实时通信的技术。通过SSE,服务器可以主动向客户端发送更新,而无需客户端不断发起请求。这对于需要实时更新的应用场景(如聊天应用、实时数据监控等)非常有用。(服务端单向传输客户端,长连接)

记得开心一点嘛的博客 1万+

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

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

alpc_qleonardo 563

FPGA—DHT11数字温湿度传感器

1. DH1T11温湿度传感器与DS18B20温湿度传感器非常类似,都是严格按照时序要求写代码。建议可以比较学习。2. 显示温度与湿度部分的数据处理,采用 X10 进行在数码管上的移一位显示,配合了数码管小数部分的显示特点又区分了温度与湿度。3. 程序是按照一个接一个状态及顺序跳转的,建议使用状态机。说明:本人使用的是野火家Xilinx Spartan6系列开发板及配套教程,以上内容如有疑惑或错误欢迎评论区指出,或者移步B站观看野火家视频教程。

m0_72885897的博客 4780

PE启动盘结合360杀毒离线版:深度清除顽固病毒实战指南

在系统安全维护领域,离线查杀是一种在独立于宿主操作系统的环境下进行病毒扫描和清除的核心技术。其原理是通过一个预启动环境(如PE)加载杀毒软件,从而绕过可能已被感染或受保护的系统核心,直接访问和扫描磁盘文件。这项技术的核心价值在于能够彻底处理那些在正常系统运行时难以清除的深度隐藏病毒、Rootkit和驱动级木马。典型的应用场景包括应对勒索软件、顽固感染型病毒以及系统启动项被劫持等情况。本文以“PE启动盘”和“360杀毒离线版”这一经典组合为例,详细解析了从工具选型、环境部署到深度查杀策略的全流程,为系统维护人

weixin_29741447的博客 410

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

ExpressLRS 915MHz vs 2.4GHz:实测对比与TX12遥控器的最佳搭配方案

本文深入对比了ExpressLRS 915MHz与2.4GHz两种频段在穿透能力、延迟、抗干扰等方面的实测表现,并结合RadioMaster TX12遥控器的硬件特性,提供了从微型花飞到极限远航等不同场景下的最佳搭配方案与EdgeTX系统配置指南,帮助FPV玩家根据核心飞行需求做出精准选择。

milk8的博客 446

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

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

__夜 1071

Apple 网页 SRP 登录系列文章(二):网页参数提取与会话初始化

本文深入解析了Apple网页SRP登录的第一个关键环节。文章首先指出Apple登录页面采用多层安全架构,包括跨域跳转机制和动态参数生成。重点介绍了四种关键参数(ServiceKey、SCNT、FrameId、ServiceNum)的提取技术,通过正则表达式和JSON路径解析从HTML脚本和HTTP头中获取。最后详细说明了会话初始化流程,包括访问初始页面和构建认证URL。这些技术细节揭示了Apple如何通过复杂机制确保登录过程的安全性。

Sayid_Des的专栏 1131

OSG第三方库编译之二十一:minizip编译(Windows、Linux、Macos环境下编译)

OSG编译;第三方库;跨平台编译;minizip编译(Windows、Linux、Macos环境下编译)

LuckyHanMo的博客 2622

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

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

kdh的专栏 713

jre9下载 jdk9

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

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

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

Human_CK的专栏 914

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

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

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

Sion 792

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

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

lajiyuan的博客 192

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、付费专栏及课程。

余额充值