poj2778 DNA Sequence (ACAM+dp+矩阵倍增)
求不包含模式串的文本串个数,n极大。我们还是类似的建出ACAM,然后在上面跑dp,只不过这次我们要矩阵倍增来加速。复杂度O((m∗len)3logn)O((m*len)^3logn)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define ll long long
#define N 110
#define inf 0x3f3f3f3f
#define mod 100000
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();return x*f;
}
char s[30];
int n=0,K,m,rt,son[N][4],fail[N],end[N],id[300],ans=0;
struct Matrix{int a[N][N];Matrix(){}Matrix(bool flag){memset(a,0,sizeof(a));if(flag) for(int i=1;i<=n;++i) a[i][i]=1;}friend Matrix operator*(Matrix a,Matrix b){Matrix res(0);for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)for(int k=1;k<=n;++k)res.a[i][j]=(res.a[i][j]+(ll)a.a[i][k]*b.a[k][j])%mod;return res;}friend Matrix operator^(Matrix a,int k){Matrix res(1);for(;k;k>>=1,a=a*a)if(k&1) res=res*a;return res;}
}a,b;
inline void ins(char *s){int len=strlen(s+1),p=rt;for(int i=1;i<=len;++i){int &y=son[p][id[s[i]]];if(!y) y=++n;p=y;}end[p]=1;
}
inline void buildAC(){queue<int>q;q.push(rt);while(!q.empty()){int x=q.front();q.pop();for(int i=0;i<4;++i){int &y=son[x][i];if(!y){y=son[fail[x]][i];continue;}q.push(y);fail[y]=son[fail[x]][i];end[y]|=end[fail[y]];}}
}
int main(){
// freopen("a.in","r",stdin);m=read();K=read();rt=++n;id['A']=0;id['T']=1;id['C']=2;id['G']=3;for(int i=0;i<4;++i) son[0][i]=rt;for(int i=1;i<=m;++i) scanf("%s",s+1),ins(s);buildAC();for(int i=1;i<=n;++i)for(int j=0;j<4;++j)if(!end[i]&&!end[son[i][j]]) a.a[i][son[i][j]]++;a=a^K;for(int i=1;i<=n;++i)if(!end[i]) ans=(ans+a.a[1][i])%mod;printf("%d\n",ans);return 0;
}
poj2778 DNA Sequence (ACAM+dp+矩阵倍增)相关推荐
- 【距离GDOI:128天】【POJ2778】DNA Sequence(AC自动机+矩阵加速)
已经128天了?怎么觉得上次倒计时150天的日子还很近啊 ....好吧为了把AC自动机搞透我也是蛮拼的..把1030和这道题对比了无数遍...最终结论是...无视时间复杂度,1030可以用这种写法解. ...
- POJ 2778 DNA Sequence [AC自动机 + 矩阵快速幂]
http://poj.org/problem?id=2778 题意:给一些只由ACGT组成的模式串,问有多少种长度为n且不含有给出的模式串的DNA序列. 自动机的状态转换可以看成一个有向图(有重边的) ...
- POJ - 2778 DNA Sequence(AC自动机+矩阵快速幂)
题目链接:点击查看 题目大意:给出 n 个长度不大于 10 的字符串表示病毒串,再给出一个长度 len ,问长度为 len 的字符串中,有多少个字符串不含有病毒串作为子串 题目分析:因为病毒串的长度和 ...
- poj-2778 DNA Sequence
题意: 给出n个AGCT组成的字符串和一个数m: 求AGCT能组成的长度为m的串的个数: n<=10,字符串长度<=10,m<=2x10^9: 题解: 构造一个满足题意的长度为x的串 ...
- poj2778DNA Sequence (AC自动机+矩阵快速幂)
转载请注明出处: http://www.cnblogs.com/fraud/ --by fraud DNA Sequence Time Limit: 1000MS Memory ...
- E - DNA Sequence POJ - 2778
It's well known that DNA Sequence is a sequence only contains A, C, T and G, and it's very useful to ...
- 【POJ No. 2778】DNA 序列 DNA Sequence
[POJ No. 2778]DNA 序列 DNA Sequence 北大OJ 题目地址 [题意] DNA序列是一个只包含A.C.T和G的序列.分析DNA序列片段非常有用,若动物的DNA序列包含片段AT ...
- Codeforces 621E Wet Shark and Block【dp + 矩阵快速幂】
题意: 有b个blocks,每个blocks都有n个相同的0~9的数字,如果从第一个block选1,从第二个block选2,那么就构成12,问对于给定的n,b有多少种构成方案使最后模x的余数为k. 分 ...
- 【bzoj3329】Xorequ 数位dp+矩阵乘法
题目描述 输入 第一行一个正整数,表示数据组数据 ,接下来T行 每行一个正整数N 输出 2*T行 第2*i-1行表示第i个数据中问题一的解, 第2*i行表示第i个数据中问题二的解, 样例输入 1 1 ...
最新文章
- 洛谷P4568 飞行路线 最短路k条免费
- 区块链课程笔记-第一课哈希算法在加密中的应用
- iOS 10、Xcode 8 遇到部分问题解决记录(包括控制台日志不输出)
- 二叉搜索树的第k个节点java_剑指Offer62:二叉搜索树的第k个结点(Java)
- JavaScript数据结构与算法——栈详解
- 高斯模糊为什么叫高斯滤波_为什么高斯是所有发行之王?
- 2000年考研英语阅读理解文章三
- 微软BI 之SSIS 系列 - 理解Data Flow Task 中的同步与异步, 阻塞,半阻塞和全阻塞以及Buffer 缓存概念...
- 计算机信息处理技术员初级难不难,考信息处理技术员之前,这些问题你要知道!...
- Python基础之文件操作
- 网站视频链接自动提取下载
- 鼠标失灵c语言代码,[转载]键盘和鼠标操作失灵代码
- Python3 - 补充知识点之HTML 、JavaScript、CSS (第五天)
- Chrome for Mac键盘快捷键!
- 文字图片在一行时候,图片居中问题
- 软件构造复习小结(2)——设计规约(Specification)
- 2022珠三角深圳国际半导体防静电材料展览会
- 三菱服务器有电源不显示,为什么打开电动车电源,仪表不显示?老师傅告诉你!...
- POI读写超大数据量Excel,解决超过几万行而导致内存溢出的问题(附源码)
- java字符串去掉中文_Java——去除字符串中的中文