poj3691 DNA repair[DP+AC自动机]
$给定 n 个模式串,和一个长度为 m 的原串 s,求至少修改原串中的几个字符可以使得原串中不包含任一个模式串。模式串总长度 ≤ 1000,m ≤ 1000。$
先建出模式串的AC自动机,然后考虑怎么求最优解。考虑AC自动机上DP,设$f_{i,j}$走了$i$步之后在$j$节点时候的最少修改次数。
标记处所有不能走到的点(即走到就匹配了的点,即后缀为某一模式串的所有点),走点的时候应当回避这些点,转移的时候向合法的状态转移,分两种。
一种沿着原串$s_i$走,$f_{i+1,to_j}\leftarrow f_{i,j}$,另一种是走其他路,$f_{i+1,to_j'}\leftarrow f_{i,j}+1$。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define dbg(x) cerr << #x << " = " << x <<endl
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
template<typename T>inline T _min(T A,T B){return A<B?A:B;}
template<typename T>inline T _max(T A,T B){return A>B?A:B;}
template<typename T>inline char MIN(T&A,T B){return A>B?(A=B,):;}
template<typename T>inline char MAX(T&A,T B){return A<B?(A=B,):;}
template<typename T>inline void _swap(T&A,T&B){A^=B^=A^=B;}
template<typename T>inline T read(T&x){
x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
while(isdigit(c))x=x*+(c&),c=getchar();return f?x=-x:x;
}
const int N=+,INF=0x3f3f3f3f;
int ha[],tr[N][],ban[N],nxt[N],legal[N],cnt,tot;
char s[N];
int n;
inline void Insert(){
int len=strlen(s+),x=;
for(register int i=,c=ha[s[]];i<=len;++i,c=ha[s[i]]){
if(!tr[x][c])tr[x][c]=++tot;
x=tr[x][c];
}
ban[x]=;
}
queue<int> q;
inline void Build(){
legal[cnt=]=;
memset(nxt,,sizeof nxt);
for(register int i=;i<;++i)if(tr[][i])nxt[tr[][i]]=,q.push(tr[][i]);
while(!q.empty()){
int x=q.front();q.pop();
if(ban[nxt[x]])ban[x]=;
if(!ban[x])legal[++cnt]=x;
for(register int i=;i<;++i)
if(tr[x][i])nxt[tr[x][i]]=tr[nxt[x]][i],q.push(tr[x][i]);
else tr[x][i]=tr[nxt[x]][i];
}
}
#define j legal[_]
int f[N][N],ans,T;
inline void dp(){
memset(f,0x3f,sizeof f);
f[][]=;ans=INF;
int len=strlen(s+);
for(register int i=;i<len;++i)
for(register int _=;_<=cnt;++_)if(f[i][j]<INF){
int c=ha[s[i+]];//dbg(i),dbg(j),dbg(f[i][j]);
for(register int k=;k<;++k)
if(!ban[tr[j][k]]&&(c^k))
MIN(f[i+][tr[j][k]],f[i][j]+);
if(!ban[tr[j][c]])MIN(f[i+][tr[j][c]],f[i][j]);
}
for(register int _=;_<=cnt;++_)MIN(ans,f[len][j]);
}
#undef j
int main(){//freopen("test.in","r",stdin);//freopen("test.ans","w",stdout);
ha['A']=,ha['C']=,ha['G']=,ha['T']=;
while(read(n)){
memset(ban,,sizeof ban);memset(tr,,sizeof tr),tot=;
for(register int i=;i<=n;++i)scanf("%s",s+),Insert();
Build();scanf("%s",s+);dp();
printf("Case %d: %d\n",++T,ans<INF?ans:-);
}
return ;
}
总结:AC自动机上DP多为$f_{i,j}$型状态设计,需要考虑每一步各种转移情况。过于浅薄
poj3691 DNA repair[DP+AC自动机]的更多相关文章
- HDU 2457 DNA repair(AC自动机+DP)题解
题意:给你几个模式串,问你主串最少改几个字符能够使主串不包含模式串 思路:从昨天中午开始研究,研究到现在终于看懂了.既然是多模匹配,我们是要用到AC自动机的.我们把主串放到AC自动机上跑,并保证不出现 ...
- 【POJ3691】 DNA repair (AC自动机+DP)
DNA repair Time Limit: 2000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Description B ...
- HDU 2425 DNA repair (AC自动机+DP)
DNA repair Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU2457 DNA repair(AC自动机+DP)
题目一串DNA最少需要修改几个基因使其不包含一些致病DNA片段. 这道题应该是AC自动机+DP的入门题了,有POJ2778基础不难写出来. dp[i][j]表示原DNA前i位(在AC自动机上转移i步) ...
- 【POJ3691】DNA repair(AC自动机,DP)
题意: 生物课上我们学到,DNA序列中只有A, C, T和G四种片段. 经科学发现,DNA序列中,包含某些片段会产生不好的基因,如片段"ATC"是不好片段,则"AGATC ...
- 咕咕(数位dp+AC自动机)
咕咕(数位dp+AC自动机) 若一个字符串的字符集合是0~m-1,那么称它为m进制字符串.给出n个m进制字符串\(s_i\),每个字符串的权值为\(v_i\).对于另一个m进制字符串\(S\),设\( ...
- 洛谷$P4045\ [JSOI2009]$密码 $dp$+$AC$自动机
正解:$dp$+$AC$自动机+搜索 解题报告: 传送门$QwQ$ 首先显然先建个$AC$自动机,然后考虑设$f_{i,j,k}$表示长度为$i$,现在在$AC$自动机的第$j$个位置,已经表示出来的 ...
- POJ 3691 DNA repair (DP+AC自动机)
DNA repair Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4815 Accepted: 2237 Descri ...
- 【AC自动机】【动态规划】poj3691 DNA repair
http://blog.csdn.net/kk303/article/details/6929641 http://blog.csdn.net/human_ck/article/details/657 ...
随机推荐
- day22 subprocess、configeparser、表格操作模块
今日内容: 1.configparser模块的使用 2.subprocess模块的使用 3.表格处理模块 xlrd模块 xlwt模块 1.configparser模块 configparser模块是用 ...
- xtrabackup备份失败(error writing file 'UNOPENED')
xtrabackup备份失败 解决了,是因为limit open files值设置太小了 (3)修改资源限制参数 vi /etc/security/limits.conf nproc:用户创建进程数限 ...
- mysql函数使用报错
This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its de 错误解决办法 解决办法也有两种,第一种是在创建 ...
- Response.write()弹出窗口的问题!
今天偶然发现在.NET中使用Javascript语句弹出窗口时发现一个小小的问题! 例子如下: 1: Response.Write ("<script languge=javascri ...
- 老贾的幸福生活day03 之思维导图
思维导图 层级关系 从大范围到具体 编程语言 编译型 C C++ ...... 解释型 python php ......... python 基础语法 基础数据类 ...
- iview给布局MenuItem标签绑定点击事件
@click.native="menuHandleClick"
- MySQL中导入Excel表格中的数据
在数据库中建立好响应的数据库.表(参考excel表格中列中的名字和内容): 将excel表格另存为txt文件,选择“文本文件(制表符分割)”: 打开相应的txt文件,只留下要导入的数据(windows ...
- 怎样理解DOM
一句话总结: DOM 是一个 js 对象. 他可以赋予 js 控制 html 文档的能力. 全称: Document Object Model. DOM 的最小组成单位是: 节点 , 节点有7种类型 ...
- 解决VS2005打开js,css,asp.php等文件,中文都是乱码的问题
用记事本打开可以正常观看但是用VS2005编辑器打开JS,中文确实乱码. 解决办法:在VS 2005 的设置里面选择自动检测Utf-8:“工具”->“选项”->“文本编辑器”->“自 ...
- JS基础_while的练习1
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...