DNA Sequence POJ - 2778 AC 自动机 矩阵乘法
定义重载运算的时候一定要将矩阵初始化,因为这个调了一上午......
Code:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<string>
#define maxn 100000
typedef long long ll;
using namespace std;
void setIO(string a){ freopen((a+".in").c_str(),"r",stdin); } char arr[maxn];
int mod, nodes;
struct matrix{
int m[105][105];
}mat;
void init(matrix &c){ for(int i=0;i<=nodes;++i) c.m[i][i]=1; }
void get(matrix &c) {for(int i=0;i<=nodes;++i) for(int j=0;j<=nodes;++j) c.m[i][j]=0;}
void print(matrix a){
for(int i=0;i<=nodes;++i){
for(int j=0;j<=nodes;++j) printf("%d ",a.m[i][j]);
printf("\n");
}
}
matrix operator*(matrix a,matrix b){
matrix c;
get(c);
for(int i=0;i<=nodes;++i)
for(int j=0;j<=nodes;++j)
for(int k=0;k<=nodes;++k){
c.m[i][j]+=((ll)a.m[i][k]*b.m[k][j])%mod;
c.m[i][j]%=mod;
}
return c;
}
matrix power(matrix a,long long k){
matrix ans;
for(int i=0;i<=nodes;++i) ans.m[i][i]=1;
while(k){
if(k&1)ans=ans*a;
a=a*a;
k/=2;
}
return ans;
}
struct Automaton{
#define sigma 4
int get(char s){
if(s=='A') return 0;
if(s=='C') return 1;
if(s=='T') return 2;
if(s=='G') return 3;
}
int ch[maxn][sigma],tag[maxn],fail[maxn];
void insert(char str[]){
int n=strlen(str);
int j=0;
for(int i=0;i<n;++i){
if(!ch[j][get(str[i])]) ch[j][get(str[i])]=++nodes;
j=ch[j][get(str[i])];
}
tag[j]=1;
}
queue<int>Q;
void build(){
for(int i=0;i<sigma;++i) if(ch[0][i]) Q.push(ch[0][i]);
while(!Q.empty()){
int u=Q.front();Q.pop();
if(tag[fail[u]]) tag[u]=1;
for(int i=0;i<sigma;++i){
int r=ch[u][i];
if(!r) { ch[u][i]=ch[fail[u]][i]; continue; }
fail[r]=ch[fail[u]][i];
Q.push(r);
}
} for(int i=0;i<=nodes;++i)
for(int j=0;j<sigma;++j)
if(!tag[i]&&!tag[ch[i][j]]) mat.m[i][ch[i][j]]+=1; }
}aho; int main(){
//setIO("input");
mod=100000;
int m, ans=0; long long n;
scanf("%d%lld",&m,&n);
for(int i=1;i<=m;++i)scanf("%s",arr), aho.insert(arr);
aho.build();
matrix fin=power(mat,n);
for(int i=0;i<=nodes;++i) ans=(ans+fin.m[0][i])%mod;
printf("%d",ans);
return 0;
}
DNA Sequence POJ - 2778 AC 自动机 矩阵乘法的更多相关文章
- DNA Sequence POJ - 2778 AC自动机 && 矩阵快速幂
It's well known that DNA Sequence is a sequence only contains A, C, T and G, and it's very useful to ...
- POJ 2778 (AC自动机+矩阵乘法)
POJ 2778 DNA Sequence Problem : 给m个只含有(A,G,C,T)的模式串(m <= 10, len <=10), 询问所有长度为n的只含有(A,G,C,T)的 ...
- poj 2778 AC自动机+矩阵快速幂
题目链接:https://vjudge.net/problem/POJ-2778 题意:输入n和m表示n个病毒,和一个长为m的字符串,里面只可以有'A','C','G','T' 这四个字符,现在问这个 ...
- 【bzoj1444】[Jsoi2009]有趣的游戏 AC自动机+矩阵乘法
题目描述 输入 注意 是0<=P 输出 样例输入 样例输出 题解 AC自动机+矩阵乘法 先将所有字符串放到AC自动机中,求出Trie图. 然后构建邻接矩阵:如果x不是某个字符串的末位置,则x连向 ...
- DNA Sequence - POJ 2778(AC自动机+矩阵乘法)
题目大意:DNA序列是有 ATGC 组成的,现在知道一些动物的遗传片段有害的,那么如果给出这些有害的片段,能否求出来所有长度为 N 的基因中有多少是不包含这些有害片段的. 分析:也是断断续续做了一 ...
- POJ 2778 DNA Sequence (AC自动机,矩阵乘法)
题意:给定n个不能出现的模式串,给定一个长度m,要求长度为m的合法串有多少种. 思路:用AC自动机,利用AC自动机上的节点做矩阵乘法. #include<iostream> #includ ...
- 【poj2778-DNA Sequence】AC自动机+矩阵乘法
题意: (只含AGCT)给定m个病毒串,让你构造一个长度为n的字符串(也只含有AGCT),问有多少种方案.n很大:1<=n<=2000000000 题解: 用病毒串建立AC自动机(num个 ...
- 【POJ2778】AC自动机+矩阵乘法
DNA Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14758 Accepted: 5716 Descrip ...
- [BZOJ 1009] [HNOI2008] GT考试 【AC自动机 + 矩阵乘法优化DP】
题目链接:BZOJ - 1009 题目分析 题目要求求出不包含给定字符串的长度为 n 的字符串的数量. 既然这样,应该就是 KMP + DP ,用 f[i][j] 表示长度为 i ,匹配到模式串第 j ...
随机推荐
- Mysql实战45讲 04讲深入浅出索引(上)读书笔记 极客时间
极客时间 Mysql实战45讲 04讲深入浅出索引 极客时间(上)读书笔记 笔记体悟 1.索引的作用:提高数据查询效率2.常见索引模型:哈希表.有序数组.搜索树3.哈希表:键 - 值(key - v ...
- mysql实战45讲 (三) 事务隔离:为什么你改了我还看不见 极客时间读书笔记
提到事务,你肯定不陌生,和数据库打交道的时候,我们总是会用到事务.最经典的例子就是转账,你要给朋友小王转100块钱,而此时你的银行卡只有100块钱. 转账过程具体到程序里会有一系列的操作,比如查询余额 ...
- springMVC下ajax获取后台参数直接走错误或者报406错误问题解决
直接走错误: 返回的结果是否json化,直接返回非字符串的结果会走ajax的error函数. 报406错误: 我在学习springmvc过程中(我的项目是配置的后缀是.html),从controlle ...
- Java绘图技术基础
public class Demo1 extends JFrame{ MyPanel mp=null; public static void main(String[] args){ Demo1 de ...
- RabbitMq笔记()
RabbitMq 就是类似于一个数据库样式的操作工具. rabbit解释 有用户名登录密码之类的,还可以创建用户名,创建作用文件之类的. 2. 3.
- LCD段码驱动
假如要第3个数码关显示“8.”,则3A-3D均得为1,即Seg3和Seg4均得为1.假设模具Seg和驱动芯片Seg对应,则只需往HT1621的地址Seg3和Seg4分半发送0xF. 注意:HT1621 ...
- git远程仓库变更
查看自己的远程仓库 git remote -v 远程仓库变更 git remote remove origin //移出现有的远程仓库的地址 git remote add origin http:// ...
- 记录python之递归函数
函数move(n,a,b,c)的定义是将n个圆盘从a借助b移动到c. def move(n,a,b,c): if n==1: print a,'-->',c move (n-1,a,c,b) p ...
- 表达式中含or的赋值
or用在赋值表达式的时候,不是返回bool值,而是按以下的情况赋值 如果左侧的表达式估值为True,则返回左侧表达式 否则返回右侧表达式 例子: insignificance = 3 or 1 pri ...
- 紫书 例题11-9 UVa 1658 (拆点+最小费用流)
这道题要求每个节点只能经过一次,也就是结点容量为1, 要拆点, 拆成两个点, 中间连一条弧容量为1, 费用为0. 因为拆成两个点, 所以要经过原图中的这个节点就要经过拆成的这两个点, 又因为这两个点的 ...