Codeforces 86C Genetic engineering(AC自动机+DP)
题目大概是给几个DNA片段,求构造一个长度n的字符串的方案数,要求这个字符串每个位置的字符都属于某个包含于此字符串的DNA片段。
把那些DNA片段建一个AC自动机。考虑状态的表示:
- dp[len][x][k]表示长度len且后缀状态为自动机结点x且后k位还不满足要求的方案数
- 然后转移就是向自动机上四个方向的结点走,如果下一步结点x'是某DNA的后缀且长度比k大,那就是转移到dp[len+1][x'][0]否则转移到dp[len+1][x'][k+1]。另外因为DNA最长10,所以第三维k不会超过10。
不过我还是看了别人代码才A掉这题。。忽略了某个结点不是一个DNA片段但其后缀可能是个DNA片段。
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int tn,ch[][],fail[],flag[];
int idx[];
void insert(char *s,int k){
int x=;
for(int i=; s[i]; ++i){
int y=idx[s[i]];
if(ch[x][y]==) ch[x][y]=++tn;
x=ch[x][y];
}
flag[x]=k;
}
void getFail(){
queue<int> que;
for(int i=; i<; ++i){
if(ch[][i]) que.push(ch[][i]);
}
while(!que.empty()){
int x=que.front(); que.pop();
for(int i=; i<; ++i){
if(ch[x][i]){
que.push(ch[x][i]);
fail[ch[x][i]]=ch[fail[x]][i];
flag[ch[x][i]]=max(flag[ch[x][i]],flag[ch[fail[x]][i]]);
} else ch[x][i]=ch[fail[x]][i];
}
}
}
struct Node{
int len,x,k;
Node(int _l=,int _x=,int _k=):len(_l),x(_x),k(_k){}
};
int d[][][];
bool vis[][][];
int main(){
idx['A']=; idx['C']=; idx['G']=; idx['T']=;
char str[];
int n,m;
scanf("%d%d",&n,&m);
for(int i=; i<m; ++i){
scanf("%s",str);
insert(str,strlen(str));
}
getFail();
d[][][]=;
vis[][][]=;
queue<Node> que;
que.push(Node(,,));
while(!que.empty()){
Node nd=que.front(); que.pop();
int len=nd.len,x=nd.x,k=nd.k;
if(len==n) continue;
for(int i=; i<; ++i){
if(k+<=flag[ch[x][i]]){
d[len+][ch[x][i]][]+=d[len][x][k];
d[len+][ch[x][i]][]%=;
if(!vis[len+][ch[x][i]][]){
vis[len+][ch[x][i]][]=;
que.push(Node(len+,ch[x][i],));
}
}else{
if(k>=) continue;
d[len+][ch[x][i]][k+]+=d[len][x][k];
d[len+][ch[x][i]][k+]%=;
if(!vis[len+][ch[x][i]][k+]){
vis[len+][ch[x][i]][k+]=;
que.push(Node(len+,ch[x][i],k+));
}
}
}
//vis[len][x][k]=0; //DAG
}
int res=;
for(int i=; i<=tn; ++i){
res+=d[n][i][];
res%=;
}
printf("%d",res);
return ;
}
Codeforces 86C Genetic engineering(AC自动机+DP)的更多相关文章
- Codeforces 86C Genetic engineering (AC自己主动机+dp)
题目大意: 要求构造一个串,使得这个串是由所给的串相连接构成,连接能够有重叠的部分. 思路分析: 首先用所给的串建立自己主动机,每一个单词节点记录当前节点可以达到的最长后缀. 開始的时候想的是dp[i ...
- Codeforces 1015F Bracket Substring AC自动机 + dp
Bracket Substring 这么垃圾的题怎么以前都不会写啊, 现在一眼怎么就会啊.... 考虑dp[ i ][ j ][ k ][ op ] 表示 已经填了 i 个空格, 末尾串匹配到 所给串 ...
- HDU 4758 Walk Through Squares (2013南京网络赛1011题,AC自动机+DP)
Walk Through Squares Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Oth ...
- POJ1625 Censored!(AC自动机+DP)
题目问长度m不包含一些不文明单词的字符串有多少个. 依然是水水的AC自动机+DP..做完后发现居然和POJ2778是一道题,回过头来看都水水的... dp[i][j]表示长度i(在自动机转移i步)且后 ...
- HDU2296 Ring(AC自动机+DP)
题目是给几个带有价值的单词.而一个字符串的价值是 各单词在它里面出现次数*单词价值 的和,问长度不超过n的最大价值的字符串是什么? 依然是入门的AC自动机+DP题..不一样的是这题要输出具体方案,加个 ...
- HDU2457 DNA repair(AC自动机+DP)
题目一串DNA最少需要修改几个基因使其不包含一些致病DNA片段. 这道题应该是AC自动机+DP的入门题了,有POJ2778基础不难写出来. dp[i][j]表示原DNA前i位(在AC自动机上转移i步) ...
- hdu 4117 GRE Words AC自动机DP
题目:给出n个串,问最多能够选出多少个串,使得前面串是后面串的子串(按照输入顺序) 分析: 其实这题是这题SPOJ 7758. Growing Strings AC自动机DP的进阶版本,主题思想差不多 ...
- hdu 2457(ac自动机+dp)
题意:容易理解... 分析:这是一道比较简单的ac自动机+dp的题了,直接上代码. 代码实现: #include<stdio.h> #include<string.h> #in ...
- HDU 2425 DNA repair (AC自动机+DP)
DNA repair Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
随机推荐
- HTML 快速入门
最近帮朋友研究作一个网站,虽然对很多人来说这是很简单的事情,但是对我来说却比较复杂!废话不多讲了,看看我找的HTML快速入门,说不定也会对你有帮助! 一. HTML 的基本概念 HTML ( Hyp ...
- Linux 常用软件和服务的配置网站
http://www.linuxidc.com/Linux/2012-11/73862.htm Linux zabbix的安装和配置
- win7系统扩展双屏幕时,如何在两个屏幕下都显示任务栏
扩展屏幕下都显示任务栏!!! win7系统本身无法设置该功能(目前我是不知道) 但可以下载第三方软件来解决该问题. 第一步:Dual Monitor Taskbar 下载软件 下载链接:http:// ...
- java中四种阶乘的计算
package com.zf.s2;//创建一个包 import java.math.BigInteger;//导入类 import java.util.ArrayList; import jav ...
- 【转】利用mybatis-generator自动生成代码
本文转自:http://www.cnblogs.com/yjmyzz/p/4210554.html mybatis-generator有三种用法:命令行.eclipse插件.maven插件.个人觉得m ...
- Windows下尝试PHP7提示丢失VCRUNTIME140.DLL的问题解决
前天PHP7.0.0正式版发布了,有一些比较好的改进,官方也说速度比php5.6快了两倍,性能上有了很大提升,并且也发布了从php5.x向php7迁移的问题,所以今后php网站迁移后能够大幅度的提升网 ...
- 4.前端笔记之jsdom基础
一.简介 文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口.DOM编程: DOM 是关于如何获取.修改.添加或删除 HTML ...
- c标签设置jsp页面的绝对路径
<%@ page language="java" pageEncoding="UTF-8"%><%@ taglib prefix=" ...
- 【wireshark】打开后显示There are no interfaces on which a capture can be done
解决方式:用管理员方式打开wireshark即可
- Android Design 4.4中文版发布
“两年前的今天,我们发布了 Android Design 中文版(旧闻链接). 随着 Android 系统的发展,界面和设计语言都不断的发生变化.韶华易逝.光阴苒冉,Android 进化到了 4.4 ...