博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 2778 DNA Sequence (AC自动机,矩阵乘法)
阅读量:6543 次
发布时间:2019-06-24

本文共 1284 字,大约阅读时间需要 4 分钟。

题意:给定n个不能出现的模式串,给定一个长度m,要求长度为m的合法串有多少种。

思路:用AC自动机,利用AC自动机上的节点做矩阵乘法。

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #define MOD 100000 9 char s[2005]; 10 int ch(char x){ 11 if (x=='A') return 0; 12 if (x=='C') return 1; 13 if (x=='G') return 2; 14 if (x=='T') return 3; 15 return -1; 16 } 17 struct Trie{ 18 int fail[1005],next[1005][5],end[1005],L,root; 19 int newnode(){ 20 for (int i=0;i<4;i++) 21 next[L][i]=-1; 22 end[L++]=-1; 23 return L-1; 24 } 25 void clear(){ 26 L=0; 27 root=newnode(); 28 } 29 void insert(char s[]){ 30 int len=strlen(s),now=root; 31 for (int i=0;i
Q; 39 int now; 40 for (int i=0;i<4;i++) 41 if (next[root][i]==-1) 42 next[root][i]=root; 43 else{ 44 fail[next[root][i]]=root; 45 Q.push(next[root][i]); 46 } 47 while (!Q.empty()){ 48 now=Q.front();Q.pop(); 49 if (end[fail[now]]==1) end[now]=1; 50 for (int i=0;i<4;i++){ 51 if (next[now][i]==-1) next[now][i]=next[fail[now]][i]; 52 else{ 53 fail[next[now][i]]=next[fail[now]][i]; 54 Q.push(next[now][i]); 55 } 56 } 57 } 58 } 59 }ac; 60 struct Matrix{ 61 int n,mx[105][105]; 62 Matrix(){} 63 Matrix(int x){ 64 n=x; 65 for (int i=0;i

 

转载于:https://www.cnblogs.com/qzqzgfy/p/5551741.html

你可能感兴趣的文章
Java 日志 详解
查看>>
openstack虚拟化技术和镜像制作
查看>>
一个超棒的jQuery通知栏插件 - jBar
查看>>
分享17个漂亮的电子商务网站
查看>>
JavaScript实用手册
查看>>
dpkg参数
查看>>
AS3!INT
查看>>
简述思科、华为交换机型号字母代表的意思
查看>>
memcache--mysql测试
查看>>
拷贝构造函数、拷贝函数、析构函数
查看>>
实战CGLib系列之proxy篇(一):方法拦截MethodInterceptor
查看>>
php 字符串截取
查看>>
ttcn-3
查看>>
00.java虚拟机的基本结构概念
查看>>
深入浅出 ES6:ES6 与 Babel - Broccoli 的联用
查看>>
ThreadLocal使用出现的问题
查看>>
关于十六进制和八进制负数的问题
查看>>
连接池并发的实现原理
查看>>
创建Pch预编译文件
查看>>
阿里云Centos配置iptables防火墙
查看>>