日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > hdu2457---DNA repair(AC自動機+dp)

hdu2457---DNA repair(AC自動機+dp)

來源:程序員人生   發布時間:2015-03-13 08:22:40 閱讀次數:3027次

Problem Description
Biologists finally invent techniques of repairing DNA that contains segments causing kinds of inherited diseases. For the sake of simplicity, a DNA is represented as a string containing characters ‘A’, ‘G’ , ‘C’ and ‘T’. The repairing techniques are simply to change some characters to eliminate all segments causing diseases. For example, we can repair a DNA “AAGCAG” to “AGGCAC” to eliminate the initial causing disease segments “AAG”, “AGC” and “CAG” by changing two characters. Note that the repaired DNA can still contain only characters ‘A’, ‘G’, ‘C’ and ‘T’.

You are to help the biologists to repair a DNA by changing least number of characters.

Input
The input consists of multiple test cases. Each test case starts with a line containing one integers N (1 ≤ N ≤ 50), which is the number of DNA segments causing inherited diseases.
The following N lines gives N non-empty strings of length not greater than 20 containing only characters in “AGCT”, which are the DNA segments causing inherited disease.
The last line of the test case is a non-empty string of length not greater than 1000 containing only characters in “AGCT”, which is the DNA to be repaired.

The last test case is followed by a line containing one zeros.

Output
For each test case, print a line containing the test case number( beginning with 1) followed by the
number of characters which need to be changed. If it’s impossible to repair the given DNA, print ⑴.

Sample Input

2 AAA AAG AAAG 2 A TG TGAATG 4 A G C T AGT 0

Sample Output

Case 1: 1 Case 2: 4 Case 3: ⑴

Source
2008 Asia Hefei Regional Contest Online by USTC

Recommend
teddy | We have carefully selected several similar problems for you: 2458 2459 2456 2461 2462

設每個模式串結尾所在的節點為危險節點,明顯在AC自動機上,如果1個節點的fail指針指向的那個節點是危險節點,那末這個節點是危險節點,由于它們是后綴關系
設dp[i][j]表示長度為i,在節點j時,且不包括任何危險節點,所需要改變的最少的字符數

/************************************************************************* > File Name: hdu2457.cpp > Author: ALex > Mail: zchao1995@gmail.com > Created Time: 2015年03月05日 星期4 14時29分23秒 ************************************************************************/ #include <map> #include <set> #include <queue> #include <stack> #include <vector> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const double pi = acos(-1); const int inf = 0x3f3f3f3f; const double eps = 1e⑴5; typedef long long LL; typedef pair <int, int> PLL; const int MAX_NODE = 2010; const int CHILD_NUM = 4; int dp[1010][MAX_NODE]; struct AC_Automation { int next[MAX_NODE][CHILD_NUM]; int fail[MAX_NODE]; int end[MAX_NODE]; int root, L; int ID (char c) { if (c == 'A') { return 0; } if (c == 'G') { return 1; } if (c == 'C') { return 2; } if (c == 'T') { return 3; } } int newnode () { for (int i = 0; i < CHILD_NUM; ++i) { next[L][i] = -1; } end[L++] = 0; return L - 1; } void init () { L = 0; root = newnode (); } void Build_Trie (char buf[]) { int now = root; int len = strlen (buf); for (int i = 0; i < len; ++i) { if (next[now][ID(buf[i])] == -1) { next[now][ID(buf[i])] = newnode(); } now = next[now][ID(buf[i])]; } end[now] = 1; } void Build_AC () { queue <int> qu; fail[root] = root; for (int i = 0; i < CHILD_NUM; ++i) { if (next[root][i] == -1) { next[root][i] = root; } else { fail[next[root][i]] = root; qu.push (next[root][i]); } } while (!qu.empty()) { int now = qu.front(); qu.pop(); if (end[fail[now]]) { end[now] = 1; } for (int i = 0; i < CHILD_NUM; ++i) { if (next[now][i] == -1) { next[now][i] = next[fail[now]][i]; } else { fail[next[now][i]] = next[fail[now]][i]; qu.push (next[now][i]); } } } } void solve(char buf[]) { memset (dp, inf, sizeof(dp)); dp[0][0] = 0; int len = strlen (buf); for (int i = 0; i < len; ++i) { for (int j = 0; j < L; ++j) { if (dp[i][j] < inf) { for (int k = 0; k < 4; ++k) { int now = next[j][k]; if (end[now]) { continue; } int use = dp[i][j]; if (k != ID(buf[i])) { ++use; } dp[i + 1][now] = min (dp[i + 1][now], use); } } } } int ans = inf; for (int i = 0; i < L; ++i) { ans = min (ans, dp[len][i]); } printf("%d ", ans >= inf ? -1 : ans); } }AC; char buf[1010]; int main () { int n; int icase = 1; while (~scanf("%d", &n), n) { printf("Case %d: ", icase++); AC.init(); for (int i = 1; i <= n; ++i) { scanf("%s", buf); AC.Build_Trie (buf); } AC.Build_AC(); scanf("%s", buf); AC.solve (buf); } return 0; }
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 欧美高清视频在线观看 | 亚洲精品尤物福利在线一区 | 久久国产精品偷 | 日韩精品在线播放 | 一区精品视频 | av片免费在线播放 | 日日夜夜草 | 国产麻豆一区二区 | www.日韩av | 久久亚洲精品小早川怜子66 | 丝袜诱惑中文字幕 | 精品国产1区 | 综合久久狠狠色成人网 | 国产一区二区三区网站 | 国产精品美女视频 | 日韩不卡av| 国产免费看片 | 亚洲乱码视频 | 看全黄大色黄大片美女爽一次 | 亚洲成人精品在线 | 亚洲一区久久久 | www.99精品 | 国产激情在线视频 | 午夜精品一区 | 无码日韩精品一区二区免费 | 亚洲欧美综合久久 | 免费a在线播放 | 欧美在线一区二区三区四区 | 精品福利在线观看 | 日韩欧美综合在线视频 | 欧美日韩中文字幕 | 国产一级片毛片 | 狠狠干狠狠干 | 国产亚州av | 国产精品久久久久久久久久久久久 | 美国成人毛片 | 99久久99久久精品免费看蜜桃 | 国产精品久久久久久a | 国产激情在线观看 | 国产精品久久久久久久久久免费 | 欧美 日韩 国产 一区 |