POJ 2778 DNA Sequence (AC自动机,矩阵乘法)
2016-06-02 08:14
405 查看
题意:给定n个不能出现的模式串,给定一个长度m,要求长度为m的合法串有多少种。
思路:用AC自动机,利用AC自动机上的节点做矩阵乘法。
思路:用AC自动机,利用AC自动机上的节点做矩阵乘法。
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<string> #include<algorithm> #include<queue> #define MOD 100000 char s[2005]; int ch(char x){ if (x=='A') return 0; if (x=='C') return 1; if (x=='G') return 2; if (x=='T') return 3; return -1; } struct Trie{ int fail[1005],next[1005][5],end[1005],L,root; int newnode(){ for (int i=0;i<4;i++) next[L][i]=-1; end[L++]=-1; return L-1; } void clear(){ L=0; root=newnode(); } void insert(char s[]){ int len=strlen(s),now=root; for (int i=0;i<len;i++){ if (next[now][ch(s[i])]==-1) next[now][ch(s[i])]=newnode(); now=next[now][ch(s[i])]; } end[now]=1; } void build(){ std::queue<int>Q; int now; for (int i=0;i<4;i++) if (next[root][i]==-1) next[root][i]=root; else{ fail[next[root][i]]=root; Q.push(next[root][i]); } while (!Q.empty()){ now=Q.front();Q.pop(); if (end[fail[now]]==1) end[now]=1; for (int i=0;i<4;i++){ if (next[now][i]==-1) next[now][i]=next[fail[now]][i]; else{ fail[next[now][i]]=next[fail[now]][i]; Q.push(next[now][i]); } } } } }ac; struct Matrix{ int n,mx[105][105]; Matrix(){} Matrix(int x){ n=x; for (int i=0;i<n;i++) for (int j=0;j<n;j++) mx[i][j]=0; } }; Matrix operator *(Matrix a,Matrix b){ int n=a.n; Matrix c=Matrix(n); for (int i=0;i<n;i++) for (int j=0;j<n;j++) for (int k=0;k<n;k++){ int tmp=(long long) a.mx[i][k]*b.mx[k][j]%MOD; c.mx[i][j]=(c.mx[i][j]+tmp)%MOD; } return c; } Matrix powm(Matrix t,int m){ Matrix r=Matrix(t.n); for (int i=0;i<=t.n;i++) r.mx[i][i]=1; while (m){ if (m%2) r=r*t; t=t*t; m/=2; } return r; } int main(){ int m; int n; while (scanf("%d%d",&n,&m)!=EOF){ ac.clear(); for (int i=0;i<n;i++){ scanf("%s",s); ac.insert(s); } ac.build(); Matrix a=Matrix(ac.L); for (int i=0;i<ac.L;i++) for (int j=0;j<4;j++) if (ac.end[ac.next[i][j]]==-1) a.mx[i][ac.next[i][j]]++; a=powm(a,m); int ans=0; for (int i=0;i<a.n;i++) ans=(ans+a.mx[0][i])%MOD; printf("%d\n",ans); } }
相关文章推荐
- 07.LoT.UI 前后台通用框架分解系列之——强大的文本编辑器
- marquee---jsp中的滚动字幕标记
- Bluemix cf命令
- Bluemix 各个组件
- IBM bluemix Big Picture
- JavaSE_Java序列化和serialVersionUID
- HUE的简单介绍
- UItableViewCell一些实用细节与技巧
- UIDynamic 物理仿真
- uiimageView显示图片的中间部分
- UITableViewCell的一种得不到cell高度正确值问题的解决
- iOS-可拉伸放大的UITableView头部视图
- UITableView去除多余的分隔线
- UIPickerView选择视图
- UICollectionView详解
- UIView添加UITapGestureRecognizer和UITableView点击冲突
- APUE(3)---文件I/O (2)
- 【转】UIColor对颜色的自定义
- 获得UITableViewCell 在屏幕中的位置
- vs2010+QT 中添加ui