POJ2778

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

刷AC自动机,很久以前做过,再系统地做一便,发现之前dp矩阵的裸体都过不了。玄学修改后就行了(板子问题???)

记录一下

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define ll long long
int ch[105][5];
int root = 0;
ll mod = (ll)1e5;
int fail[105], val[105], sz;

char rea[4] = {'A', 'T', 'C', 'G'};

int react(char c)
{
    if (c == 'A')
        return 0;
    if (c == 'T')
        return 1;
    if (c == 'C')
        return 2;
    if (c == 'G')
        return 3;
}

void init()
{
    sz = 0;
    root = 0;
    val[0] = 0;
    for (int i = 0; i <= 3; i++)
        ch[root][i] = root;
}

int newnode()
{
    sz++;
    val[sz] = 0;
    for (int i = 0; i < 4; i++)
        ch[sz][i] = 0;
    return sz;
}

void build(char buf[])
{
    int cur = root;
    int len = strlen(buf);
    for (int i = 0; i < len; i++)
    {
        int c = react(buf[i]);
        if (ch[cur][c] == root)
        {
            int u = newnode();
            ch[cur][c] = u;
        }
        cur = ch[cur][c];
    }
    val[cur] = 1;
}

void getfail()
{
    int cur = root;
    queue<int> q;
    for (int i = 0; i <= 3; i++)
    {
        if (ch[root][i] == root)
        {
            continue;
        }
        int u = ch[root][i];
        fail[u] = root;
        q.push(u);
    }
    while (!q.empty())
    {
        int u = q.front();
        q.pop();
        val[u] |= val[fail[u]];
        for (int i = 0; i <= 3; i++)
        {
            int v = ch[u][i];
            if (v == root)
            {
                ch[u][i] = ch[fail[u]][i];
                continue;
            }
            fail[v] = ch[fail[u]][i];
            q.push(v);
        }
    }
}

struct matrix
{
    ll a[105][105];

    matrix()
    {
        for (int i = 0; i <= sz; i++)
            for (int j = 0; j <= sz; j++)
                a[i][j] = 0;
    }

    ll* operator [] (int i)
    {
        return a[i];
    }
};

matrix base;

matrix mult(matrix a, matrix b)
{
	matrix ans;
	for (int i = 0; i <= sz; i++)
	{
		for (int j = 0; j <= sz; j++)
		{
			for (int k = 0; k <= sz; k++)
			{
				ans[i][j] += a[i][k] * b[k][j] % mod;
				ans[i][j] %= mod;
			}
		}
	}
	return ans;
}

void get_base()
{
    for (int cur = root; cur <= sz; cur++)
    {
        if (val[cur])
            continue;
        for (int i = 0; i <= 3; i++)
        {
            if (val[ch[cur][i]])
                continue;
            base[cur][ch[cur][i]]++;
        }
    }
}

template<class T>
void read(T& ret)
{
    ret = 0;
    char c;
    while ((c = getchar()) > '9' || c < '0');
    while (c >= '0' && c <= '9')
    {
        ret = ret * 10 + c - '0';
        c = getchar();
    }
}
char s[100];

int main()
{
    int m;
    ll n;
    read(m), read(n);
    init();
    for (int i = 1; i <= m; i++)
    {
        scanf("%s", s);
        build(s);
    }
    getfail();
    matrix ans;
    for (int i = 0; i <= sz; i++)
        ans[i][i] = 1;
    get_base();

    while (n)
    {
        if (n & 1)
            ans = mult(ans, base);
        base = mult(base, base);
        n >>= 1;
    }
    
    ll sum = 0;
    for (int i = 0; i <= sz; i++)
        sum = (sum + ans[0][i]) % mod;
    printf("%lld\n", sum);

    return 0;
}

 

利用kettle进行数据库数据比对 Kettle是一款国外开源的ETL工具,纯java编写,可以在Windows、Linux、Unix上运行,数据抽取高效稳定。本人用的版本是6.1。 之前用kettle这个开源的ETL工具是用来做数据抽取的,这次测试有个需求,是做数据库数据的比对。验证源表到目标表的逻辑正确,从而利用源表自己写SQL逻辑,生成的结果和目标表去比对。这次想到了利用kettle的数据比较功能,来做这些数据校验。 ... 阅读详情

相关推荐

三部对接 sora-2:OpenAI 最新视频模型快速接入指南

本文介绍OpenAI最新视频生成模型Sora-2的接入方案,重点解析其Chat格式调用功能。开发者可通过在提示词中嵌入"横屏/竖屏""时长""清晰度"等要求快速生成视频。文章分三部分:1)基础准备(环境配置与API密钥获取);2)核心调用(提供Python/Java示例代码);3)结果查询与优化建议。Sora-2支持多语言调用,简化了视频生成流程,适用于短视频、广告创意等场景。

2501_93565190的博客 3422

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

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

idemor的博客 942

深入理解C语言内存管理:堆与栈的区别

栈是一种遵循后进先出(LIFO)原则的数据结构。在程序中,栈用于存储局部变量、函数的参数以及函数调用时的返回地址等信息。栈的内存管理由操作系统自动进行,每次函数调用时都会在栈上分配一块内存区域,函数执行完毕后,该内存区域会自动释放。在C语言中,堆与栈是两种不同的内存分配方式,各自有着不同的特点和适用场景。栈内存自动管理,访问速度快,但大小有限,适用于存储局部变量和函数调用信息。堆内存由程序员手动管理,适用于存储动态数据结构,大小不受限制,但访问速度较慢,容易导致内存泄漏等问题。

set_one的博客 1579

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

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

morejarphone~ 416

AHB不对称半桥反激电路设计(一)变换器拓扑工作原理详解

本文详细分析了AHB(不对称半桥)反激变换器拓扑的工作原理及关键优势。该拓扑通过谐振腔结构实现原边功率管的零电压开通(ZVS)和副边整流管的零电流关断(ZCS),显著提升效率至95%以上。文章阐述了6个工作阶段的时序特征,包括谐振电感电流和电容电压的数学模型推导。AHB拓扑具有漏感能量回收、宽电压输出(适配PD快充等场景)和协同储能等优势,相比传统方案可缩小变压器体积30%,成为100-300W隔离电源的理想选择。

【Simon】的博客 7121

window下安装并使用nvm(含卸载node、卸载nvm、全局安装npm)

文章目录一、卸载node二、安装nvm三、配置路径和下载源四、使用nvm安装node五、nvm常用命令六、卸载nvm七、遇到的问题 nvm 全名 node.js version management,顾名思义是一个nodejs的版本管理工具。通过它可以安装和切换不同版本的nodejs。 一、卸载node 如果你已经安装了node,那么你需要先卸载node,如果你没有安装那直接跳过这一步到下一步。 打开控制面板 -> 打开程序和功能 -> 右上角搜索输入node -> 右键卸载 为了确保彻底

HuangsTing的博客 41万+

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

[原创]Linux 802.11n CSI tool Monitor模式

Linux 802.11n CSI tool Monitor模式 使用AP模式的缺陷在于ping 命令速度比较慢,且不能精确控制发送的参数,比如接收的包数量是不可控的。Monitor模式可以调制发送速率、发包数量、发送天线个数、HT模式、short/long guard interval等等,因此调通Monitor模式是必须的。期间参考了博主沃一德的CSI Tool安装使用讲解,对他的工作表示感...

u014645508的博客 1万+

POJ 2778 DNA Sequence

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

wly1127的博客 365

C#与欧姆龙PLC 通信——Fins Tcp协议

该调试助手专门为了帮助大家学习以及测试Fins-Tcp通信,下面进行详细介绍。

qq_34059233的博客 2080

OpenClaw一人公司落地案例:本地商家营销智能体月赚3万的秘密

角色:本地商家营销专家## 核心目标为商家生成高转化率的抖音营销策略,最大化 ROI。## 输入数据- 商家名称: "XX奶茶店"- 过去 30 天视频播放量: 12,000- 客单价: 28 元- 竞品平均播放量: 15,000- 市场趋势: rising## 策略生成规则1. **内容类型**:根据客单价推荐- < 30 元:美食探店 + 优惠券- > 30 元:场景化故事 + 会员权益2. **发布时间**:根据历史数据- 18:00-20:00 高峰期。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 542

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

C++软件调试与异常排查从入门到精通专栏介绍与文章汇总

根据近几年排查软件异常的实践与经验,系统地讲解了C++软件异常常见原因与常用排查方法,以图文并茂的方式给出具体的分析实例,带领大家逐步掌握C++软件异常排查的相关技术与要领。

dvlinker的技术专栏 23万+

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

efm32 入门.pdf

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

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

poj 2778 DNA Sequence

题目链接:http://poj.org/problem?id=2778 题目大意:问长度为N的串中不包含了模式串的串有几个。 题目思路:求长度为n的不含病毒串的字符串个数,用ac自动机构造转移矩阵,再用二分幂计算即可。需要注意的是尽量不用模运算,模运算实在是太慢了。 #include #include #include #include #include #include #include

Wings_of_Liberty的专栏 690

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

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

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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

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

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

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 AC自动机 + 矩阵快速幂

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

TIMELIMITE的专栏 924

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
上一篇: cf round #523 C
下一篇: hiho字符串
「已注销」
博客等级 码龄9年 6粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值