poj 2778

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

#include <iostream>
#include <stdio.h>
#include <cstring>

using namespace std;
#define FF(i,a)  for( int i = 0 ; i < a ; i ++ )
#define CC(m,what) memset(m,what,sizeof(m))

typedef long long ll;
const int NODE = 110;
const int MAXN = 101;
const int MOD = 100000;
const int CH = 4;
int chd[NODE][CH] , cnt;//结点个数
int word[NODE];//关键数组,记录每个单词尾结点的信息,每道题目都不一样
int fail[NODE];//传说中的失败指针
int Que[NODE];//辅助队列
int sw[128];//string swap每个字符对应的Index,方便模板化

void Ins(char *a, int val) {
 int p = 0;
 for(; *a ; a ++) {
  int c = sw[*a];
  if(!chd[p][c]) {
   //CC(chd[cnt] , 0);
   memset( chd[cnt], 0, sizeof( chd[cnt] ));
   word[cnt] = 0;
   chd[p][c] = cnt ++;
  }
  p = chd[p][c];
 }
 word[p] = val;
}

void AC() {
 int *s = Que , *e = Que;
 for ( int i = 0; i < CH; i++ )
      if(chd[0][i]) {
   fail[chd[0][i]] = 0;
   *e++ = chd[0][i];
  }
 while(s != e) {
  int p = *s++;
  for ( int i = 0 ; i < CH; i ++ ) {
   if( chd[p][i] ) {
    int v = chd[p][i];
    *e++ = v;
    fail[v] = chd[fail[p]][i];
    //word[v] += word[fail[v]];
    //对word[v]按word[fail[v]]里的内容进行处理
   } else {
    chd[p][i] = chd[fail[p]][i];

   }
  }
 }
}

void init ()
{
    fail[0] = 0;
 sw['A'] = 0;
 sw['C'] = 1;
 sw['G'] = 2;
 sw['T'] = 3;
 //下面两句每次都必须初始化
 //CC(chd[0],0);
 memset( chd[0], 0,sizeof( chd[0] ));
 //memset ( word, 0 , sizeof ( word ));
 cnt = 1;
}

int Mat_Size;
struct mat
{
    ll w[MAXN][MAXN];
    mat(){memset ( w, 0, sizeof ( w ));}
    mat operator*( mat t )
    {
        mat ans;
        for ( int i = 0; i < Mat_Size; i++ )
            for ( int j = 0; j < Mat_Size; j++ )
            {
                for ( int k = 0; k < Mat_Size; k++ )
                    ans.w[i][j] += (w[i][k]%MOD*t.w[k][j]%MOD)%MOD;
                ans.w[i][j] %= MOD;
            }
        return ans;
    }
    mat operator^( int m )
    {
        mat ans , temp;
        for ( int i = 0; i < Mat_Size; i ++ )
            ans.w[i][i] = 1;
        for ( int i = 0; i < Mat_Size; i ++ )
            for ( int j = 0; j < Mat_Size; j ++ )
                temp.w[i][j] = w[i][j];
        while ( m )
        {
            if ( m&1 )
                ans = ans*temp;
            temp = temp*temp;
            m /= 2;
        }
        return ans;
    }
};


//AC()函数处理后 chd[p][i] 就是在p结点进行i转移到达的结点


int main()
{
    int n , m;
    char c[20][100];
    while ( scanf("%d%d" ,&n ,&m ) != EOF )
    {
        //memset ( _mat , 0 , sizeof ( _mat ));
        //memset ( ans , 0 , sizeof ( ans ));
        mat ans , _mat;
        init();
        for ( int i = 0 ; i < n; i ++ )
        {
            scanf("%s" , c[i] );
        }
        for ( int i = 0 ; i < n; i ++ )
        {
            int flag = 0;
            for ( int j = 0; j < n; j ++ )
            {
                if ( strstr( c[i], c[j] ) && strcmp ( c[i] , c[j] ) )
                    flag = 1;
            }
            if ( !flag )
                Ins( c[i] , 1 );
        }
        AC();
        Mat_Size = cnt;
        for ( int i = 0 ; i < cnt ; i ++ )
            for ( int j = 0 ; j < CH; j ++ )
                if ( !word[i] )
                {
                    int temp;
                    //cout << temp << endl;
                    temp = chd[i][j];
                    if ( !word[temp] )
                        _mat.w[i][temp]++;
                }

        //cout << "here" << endl;
//        for ( int i = 0 ; i < cnt ; i ++ )
//           {
//               for ( int j = 0 ; j < cnt ; j ++ )
//                    cout << _mat.w[i][j] << "  " ;
//                cout << endl;
//           }
        ans = _mat^m;

        ll total = 0;
//                for ( int i = 0 ; i < cnt ; i ++ )
//           {
//               for ( int j = 0 ; j < cnt ; j ++ )
//                    cout << _mat[i][j] << "  " ;
//                cout << endl;
//           }

        for ( int i = 0 ; i < cnt ; i ++ )
        {
            total += ans.w[0][i]%MOD;
            total %= MOD;
        }

//         for ( int i = 0 ; i < cnt ; i ++ )
//           {
//               for ( int j = 0 ; j < cnt ; j ++ )
//                    cout << ans[i][j] << "  " ;
//                cout << endl;
//           }
        printf("%lld\n" , total%MOD);
    }
    return 0;
}

/*
4 4
AT
AC
AG
AA
2 2
C
A
*/

YOLOv8改进策略【注意力机制篇】| CVPRW-2024 分层互补注意力混合层 H-RAMi 针对低质量图像的特征提取模块 许多证据表明层次化网络对图像恢复(IR)任务通常不太有效,因为IR的目标是逐个预测像素值(密集预测),而缩小特征图会丢失重要的像素级信息。然而,层次化结构有降低时间复杂度以及学习语义级和像素级特征表示的优点。为了弥补缺点并利用优点,设计了H - RAMi层。 阅读详情

相关推荐

Acer宏碁暗影骑士擎AN515-58原厂系统恢复指南:从ISO镜像到完整出厂设置

本文详细介绍了为Acer宏碁暗影骑士擎AN515-58游戏本恢复原厂系统的完整指南。从准备工作、数据备份到下载官方镜像、制作恢复U盘,再到BIOS设置与恢复流程,一步步教你如何将系统完整还原至出厂状态,确保所有硬件驱动、NITROSENSE控制中心等专属优化功能恢复正常,解决系统卡顿、功能异常等问题。

weixin_29271263的博客 1093

【hdu3065-病毒侵袭持续中】AC自动机

【hdu3065-病毒侵袭持续中】AC自动机 题意:给定一些只含大写字母的病毒串,再给一个文本串,问文本串中每个病毒串各出现了多少次。 题解: 就是用AC自动机,在每个节点末尾有个id记录是哪个单词的末尾,然后如果同时是多个单词的末尾就用一个next数组链状记录当前id的下一个值。多组数据坑死人。坑死人。 1 #include&...

qq_25768269的博客 161

Mujoco xml actuator

在MuJoCo中,actuator(执行器) 是用于定义外部力或力矩的机制,这些力或力矩可以作用于关节、肌腱或身体。执行器可以模拟各种类型的驱动器,如电机、液压缸、肌肉等。它们通过定义传输(transmission)和力生成机制(force generation)来实现对模型的控制。

m0_52113469的博客 2893

hdu 3065 病毒侵袭持续中 //AC自动机

<br /> <br />病毒侵袭持续中Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)<br />Total Submission(s): 866    Accepted Submission(s): 293<br /><br /><br />Problem Description小t非常感谢大家帮忙解决了他的上一个问题。然而病毒侵袭持续中。在小t的不懈努力下,他发现了网路中的“万恶之源”

hqd_acm的专栏 984

群晖NAS安装HomeAssistant保姆级教程:从Docker部署到智能设备接入

本文提供了一份详尽的群晖NAS安装HomeAssistant保姆级教程,涵盖从Docker部署到智能设备接入的全过程。通过规划存储路径、配置容器环境变量和网络模式,确保系统稳定运行。教程还介绍了如何接入小米、苹果HomeKit等智能家居设备,并利用自动化与仪表盘打造本地化、高响应速度的智能中枢,实现数据隐私与远程控制的完美平衡。

play7的博客 693

蓝桥杯历年真题分类汇总(史上最全版本,一定不要错过)

天再高又怎样,踮起脚尖就更接近阳光。 满满的 题型总结​ 历年真题​ 视频讲解​ 比赛技巧 题型总结 2021 2020 2019 2018 2017 2016 2015 2014 2013 ...

m0_58367586的博客 11万+

hdu-3065(AC自动机)

Hdu-3065 思路: 考虑所有的ASCII字符的情况,用26范围内可能出错。 #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespace std; const in...

积少成多,水滴石穿 402

MIMO技术入门

MIMO:多天线技术,发射端和接收端有多个天线(注意:并不是指多个天线板,而是多套振子,每一套是一个独立的天线。) 4G:2、8天线 5G:4、64天线(64T64R) 手机也是多天线 MIMO实现效果的分类: 1)空间分集 。2)空间复用。3)波束赋形。 空间分集(space diversity) 作用:提升接收质量 利用多个天线发射或者接收一个数据流,避免单个信道衰落对整个链路的影响。(比如你的耳机坏了一只并不影响另一只) 空间复用(space multiplexing) 作用:提升速率 利

About1129的博客 2873

HDU-3065-病毒侵袭持续中(AC自动机)

转载于:https://www.cnblogs.com/GrowingJlx/p/6642744.html

abcd12341abcd1234的博客 127

博途 V15.1安装步骤

温馨提醒:安装此软件电脑配置至少应满足以下要求 处理器 CoreTM i5-3320M 3.3 GHz 或相当 内存 至少8G 硬盘 300 GB SSD 显示器 15.6' 宽屏显示 (1920 x 1080) 1.双击打开【Siemens v15.1】文件夹。 2.鼠标右击【STEP 7 BasicProfess...

谢谢关注“小鱼教你模数电”,各平台同号 9万+

等保测评-达梦数据库

一般适用于等保测评

m0_54146694的博客 1297

HDU 3065:病毒侵袭持续中(AC自动机)

http://acm.hdu.edu.cn/showproblem.php?pid=3065 题意:中文题意。 思路:直接插入然后用一个数组记录id和cnt,因为n只有1000,可以开一个数组判断第几个字符串出现过的次数,然后输出就好了。 坑点:多组输入!!!然后因为new出来的空间要自己释放,因此需要用一个vector装起来(似乎多此一举),最后delete掉。 1 #inclu...

weixin_30853329的博客 117

【报错解决】彻底解决 MySQL 登录报错 ERROR 1045 (28000)

MySQL 报错 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 通常是由于用户名或密码错误、权限不足、服务未启动或配置文件异常导致的。通过检查并确认密码、重置 root 用户密码、授予完整权限、校验配置文件以及确保 MySQL 服务正常运行,可以彻底解决该问题。掌握这一流程不仅能够恢复 root 登录,还能保障数据库的安全性与稳定性。

博客 1749

Poj 2778 DNA Sequence

题目链接:http://poj.org/problem?id=2778 题目类型:AC自动机 + 矩阵快速幂+ DP 题意:给定一些病毒的模式串,问给定的长度为N的所有DNA串中有多少是不含有病毒串的。 数据范围N最大为2000000000 这道题的解题思路可以参考:http://blog.henix.info/blog/poj-2778-aho-corasick-dp.html 和:h

894

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

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

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

poj 2778 DNA Sequence

http://poj.org/problem?id=2778   跟上一篇一样,都是自动机加矩阵的题。不过这次因为忘记将答案取模了,所以wa了一次。。。- -这次的代码相对整齐了点,没有上一篇那么乱了。。。 代码如下: View Code 1 #include <cstdio> 2 #include <iostream> 3 #include ...

weixin_30882895的博客 67

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

POJ 2778 DNA Sequence

POJ_2778     如果做过POJ_1625的话,dp思路还是比较容易想到的,如果没做过的话可以参考一下《Trie图的构建、活用与改进》这篇文章的思想。     但遇到的一个问题是,对于如此巨大无比的n我们要怎么去优化呢?这个还是依赖于动态转移方程的形式。我们可以看出这个题目的动态转移方程一个确定的和式方程,即对于任意第i+1阶段的状态j,都可以表示成f[i+1][j]=a1*f[i][...

weixin_34186931的博客 76

ac自动机+矩阵 poj 2778

ac自动机,令人神往的名字。。。 ac自动机:http://www.cppblog.com/mythit/archive/2009/04/21/80633.html poj2778:http://hi.baidu.com/%D2%D5%C1%D6010/blog/item/6

huyuncong的专栏 1064

POJ 2778 AC自动机

题目链接http://poj.org/problem?id=2778 问不包含m=10个模式串的给定长度n=2000000000的串有多少个。 大体思路:用矩阵a[i][j]表示从i到j有多少种不同的路径。其中i,j是自动机上的状态。 1 #include <cstdio> 2 #include <cstdlib> 3 #include <...

weixin_30580341的博客 90

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

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

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

TIMELIMITE的专栏 924

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

poj2778 DNA Sequence AC自动机 dp 矩阵乘法

poj2778 DNA Sequence 题意:求仅有A G C T不含有k(k<=10)个长度为d(d<=10)串的长度为L(L<=2*10^9)的串有多少个%100000 题解: 做完感觉之前对AC自动机理解的还不够透彻。 做完就透彻了?也不一定。 首先 bzoj上有一道和这个差不多 不过是kmp而不是AC自动机 bzoj1009 题解:http://www.cnblogs.com/

yxr0105 500

POJ 2778 DNA Sequence AC自动机+矩阵优化 *

题目地址:http://poj.org/problem?id=2778 数据很大,二维数组开不下,所以第一次写用了滚动数组,但是TLE 代码如下: #include #include #include #include #include #include #include #include using namespace std; typedef long long LL; const in

BRCOCOLI的博客 267
上一篇: hdu 3065
下一篇: 看到的
Sov_Matrix
博客等级 码龄17年 0粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值