ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

修复DNA

2021-08-20 22:31:25  阅读:187  来源: 互联网

标签:cnt DNA 修复 int else ++ return fl


题目描述

给定一些字符串,再给定一个母串,问通过单点修改母串使其不包含任何一个给定字符串的最小操作数是多少?

范围

\(N \leq 50,|S| \leq 1000\)

题解

\(AC自动机,dp\)

设\(f_{i,j}\)表示当前在处理\(DNA\)序列第\(i\)位,\(AC\)自动机上第\(j\)个节点时的答案。

对于\(DNA\)序列的某一位,枚举他的所有方案\(A,G,C,T\),找到\(Trie\)树上与之对应的节点,进行\(dp\)转移:

\(f_{i,p} = max(f_{i,p},f_{i - 1,j} + 1\or0)\)

代码

#include <bits/stdc++.h>
using namespace std;

const int N = 1010;
int t[N][4];
int fl[N];
int cnt[N];
int q[N];

char s[N];
int f[N][N];

int n,idx;

int check(char c) {
	if(c == 'A') return 0;
	else if(c == 'G') return 1;
	else if(c == 'C') return 2;
	else return 3;
}

void insert(char *s) {
	int p = 0;
	for(int i = 0;s[i]; ++i) {
		int num = check(s[i]);
		if(!t[p][num]) t[p][num] = ++idx;
		p = t[p][num];
	}
	cnt[p] = 1;
}

void build_AC () {
	queue <int> q;
	for(int i = 0;i < 4; ++i) {
		if(t[0][i]) q.push(t[0][i]);
	}
	while(!q.empty()) {
		int u = q.front();
		q.pop();
		for(int i = 0;i < 4; ++i) {
			if(!t[u][i]) {
				t[u][i] = t[fl[u]][i];
			}
			else {
				fl[t[u][i]] = t[fl[u]][i];
				q.push(t[u][i]);
				cnt[t[u][i]] |= cnt[fl[t[u][i]]];
			}
		}
	}
}
int cas;
int main () {
	while(~scanf("%d",&n) and n) {
		memset(t,0,sizeof t);
		memset(cnt,0,sizeof cnt);
		memset(fl,0,sizeof fl);
		idx = 0;
		for(int i = 1;i <= n; ++i) {
			scanf("%s",s);
			insert(s);
		}
		//cout << 1 << endl;
		build_AC();
		//c/out << 1 << endl;
		scanf("%s",s + 1);
		int len = strlen(s + 1);
		memset(f,0x3f,sizeof f);
		f[0][0] = 0;
		for(int i = 1;i <= len; ++i) {
			for(int j = 0;j <= idx; ++j) {
				for(int k = 0;k < 4; ++k) {
					int ok = check(s[i]) != k;
					int p = t[j][k];
					if(!cnt[p]) {
						f[i][p] = min(f[i][p],f[i - 1][j] + ok);
					}
					
				}
			}
		}
		int ans = 0x3f3f3f3f;
		for(int i = 0;i <= idx; ++i) {
			ans = min(ans,f[len][i]);
		}
		if(ans > 0x3f3f3f3f / 2) ans = -1;
		printf("Case %d: %d\n",++cas,ans);
	}
	return 0;
}

标签:cnt,DNA,修复,int,else,++,return,fl
来源: https://www.cnblogs.com/akoasm/p/15168398.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有