POJ 2778 DNA sequence
QAQ 做完禁忌 又做过文本生成器 这道题就是个水题啦
首先转移方程还是文本生成器的转移方程
但是注意到L很大,但是节点数很小
转移都是固定的,所以我们可以用AC自动机来构造转移矩阵
之后进行矩阵乘法就可以了
顺便提一句,模数是10^5,相乘会爆int
我为了省点常数自信开int,结果WA了两发QAQ
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<queue>
using namespace std; typedef long long LL;
const int maxn=112;
const int mod=100000;
int cnt=1;
int n,L,id[1010];
int t[maxn][4];
int fail[maxn];
char s[maxn];
bool end[maxn];
bool vis[maxn];
queue<int>Q;
struct Matrix{
int a[maxn][maxn];
Matrix(){memset(a,0,sizeof(a));}
void print(){
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
printf("%d ",a[i][j]);
}printf("\n");
}printf("\n");
}
}A,ans; void insert(){
scanf("%s",s+1);
int len=strlen(s+1),now=1;
for(int i=1;i<=len;++i){
int next=id[s[i]];
if(!t[now][next])t[now][next]=++cnt;
now=t[now][next];
}end[now]=true;
}
void build_fail(){
Q.push(1);fail[1]=0;
while(!Q.empty()){
int u=Q.front();Q.pop();
end[u]|=end[fail[u]];
for(int i=0;i<4;++i){
int k=fail[u];
while(k&&!t[k][i])k=fail[k];
if(t[u][i]){
fail[t[u][i]]=k?t[k][i]:1;
Q.push(t[u][i]);
}else t[u][i]=k?t[k][i]:1;
}
}return;
}
void build_Matrix(){
for(int i=1;i<=n;++i){
if(end[i])continue;
for(int j=0;j<4;++j){
if(end[t[i][j]])continue;
A.a[i][t[i][j]]++;
}
}return;
}
Matrix operator *(const Matrix &A,const Matrix &B){
Matrix C;
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
for(int k=1;k<=n;++k){
C.a[i][j]=C.a[i][j]+1LL*A.a[i][k]*B.a[k][j]%mod;
if(C.a[i][j]>=mod)C.a[i][j]-=mod;
}
}
}
return C;
}
Matrix pow_mod(Matrix v,int p){
Matrix tmp;
for(int i=1;i<=n;++i)tmp.a[i][i]=1;
while(p){
if(p&1)tmp=tmp*v;
v=v*v;p>>=1;
}return tmp;
} int main(){
scanf("%d%d",&n,&L);
id['A']=0;id['T']=1;id['C']=2;id['G']=3;
for(int i=1;i<=n;++i)insert();
build_fail();n=cnt;
build_Matrix();
ans=pow_mod(A,L);
int tot=0;
for(int i=1;i<=n;++i){
tot+=ans.a[1][i];
if(tot>=mod)tot-=mod;
}
printf("%d\n",tot);
return 0;
}
POJ 2778 DNA sequence的更多相关文章
- POJ 2778 DNA Sequence(AC自动机+矩阵加速)
DNA Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9899 Accepted: 3717 Desc ...
- POJ 2778 DNA Sequence (AC自己主动机 + dp)
DNA Sequence 题意:DNA的序列由ACTG四个字母组成,如今给定m个不可行的序列.问随机构成的长度为n的序列中.有多少种序列是可行的(仅仅要包括一个不可行序列便不可行).个数非常大.对10 ...
- poj 2778 DNA Sequence AC自动机
DNA Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11860 Accepted: 4527 Des ...
- poj 2778 DNA Sequence AC自动机DP 矩阵优化
DNA Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11860 Accepted: 4527 Des ...
- 线性代数(矩阵乘法):POJ 2778 DNA Sequence
DNA Sequence Description It's well known that DNA Sequence is a sequence only contains A, C, T and ...
- POJ 2778 DNA Sequence (ac自动机+矩阵快速幂)
DNA Sequence Description It's well known that DNA Sequence is a sequence only contains A, C, T and G ...
- poj 2778 DNA Sequence ac自动机+矩阵快速幂
链接:http://poj.org/problem?id=2778 题意:给定不超过10串,每串长度不超过10的灾难基因:问在之后给定的长度不超过2e9的基因长度中不包含灾难基因的基因有多少中? DN ...
- POJ 2778 DNA Sequence(AC自动机+矩阵快速幂)
题目链接:http://poj.org/problem?id=2778 题意:有m种DNA序列是有疾病的,问有多少种长度为n的DNA序列不包含任何一种有疾病的DNA序列.(仅含A,T,C,G四个字符) ...
- POJ 2778 DNA Sequence(AC自动机+矩阵)
[题目链接] http://poj.org/problem?id=2778 [题目大意] 给出一些字符串,求不包含这些字符串的长度为n的字符串的数量 [题解] 我们将所有串插入自动机计算match,对 ...
随机推荐
- JavaScript学习笔记(12)——JavaScript自定义对象
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- JavaScript学习笔记(11)——HTML DOM Event对象
w3cshool:时间参考手册:http://www.w3school.com.cn/jsref/dom_obj_event.asp
- winform 与 html 交互 简单案例
本文主要简单的记录winform如何与html文件中的信息如何进行交互,即在winform中加载html界面,从而可以进行相互调用. 1.新建一个winform项目,若要在winform中加载html ...
- IE=edge,chrome=1的META信息详解
这几天在玩 HTML5 ★ Boilerplate,注意到meta信息中有这么一句: 复制代码 代码如下: <meta http-equiv="X-UA-Compatible" ...
- PHP将二进制文件存入数据库以及从数据库中读取二进制文件
<?php $file = 'abcd.sqlite'; mysql_connect('localhost','root','123456'); mysql_select_db('zblog') ...
- 定时备份服务器数据库(借助windows任务计划以及mysqldump)
最近社区多了,考虑到数据的安全性,要每天备份一次数据库,以防万一: linux目前还不是很了解,先用windows的计划任务吧: 大体思路就是 借用windows的计划任务来执行备份远程数据库到本地: ...
- 增加p()函数,方便开发中对变量打印调试
在开发的过程中,我们经常要输出一下变量看看得到的结果是什么,我们就要根据变量的类型选择使用echo,print_r或者var_dump,brophp框架中的p()函数会自动根据变量类型选择用什么方法为 ...
- wpf 制作播放视频的屏保程序、而且能分屏显示
这个程序用到了WPF里 “visual_Brush”(主要是为了实现分屏显示) , “UserControl” ,这两个知识点: 在屏保状态下播放指定文件夹下的视频,而且能分屏显示: 把编译好的屏保 ...
- 监听EditText
0.得到焦点的时候,作一些处理 public class AbcActivity extends Activity implements OnFocusChangeListener{ @Overrid ...
- cocos2dx之C++调用Lua
原文地址:http://blog.csdn.net/dingkun520wy/article/details/49839701 1.引入头文件 #include "cocos2d.h&quo ...