生物學家終於發明了修復dna的技術,能夠將包含各種遺傳疾病的dn**段進行修復。
為了簡單起見,dna看作是乙個由』a』, 『g』 , 『c』 , 『t』構成的字串。
修復技術就是通過改變字串中的一些字元,從而消除字串中包含的致病片段。
例如,我們可以通過改變兩個字元,將dn**段」aagcag」變為」aggcac」,從而使得dn**段中不再包含致病片段」aag」,」agc」,」cag」,以達到修復該dn**段的目的。
需注意,被修復的dn**段中,仍然只能包含字元』a』, 『g』 , 『c』 , 『t』。
請你幫助生物學家修復給定的dn**段,並且修復過程中改變的字元數量要盡可能的少。
輸入格式
輸入包含多組測試資料。
每組資料第一行包含整數n,表示致病dn**段的數量。
接下來n行,每行包含乙個長度不超過20的非空字串,字串中僅包含字元』a』, 『g』 , 『c』 , 『t』,用以表示致病dn**段。
再一行,包含乙個長度不超過1000的非空字串,字串中僅包含字元』a』, 『g』 , 『c』 , 『t』,用以表示待修復dn**段。
最後一組測試資料後面跟一行,包含乙個0,表示輸入結束。
輸出格式
每組資料輸出乙個結果,每個結果佔一行。
輸入形如」case x: y」,其中x為測試資料編號(從1開始),y為修復過程中所需改變的字元數量的最小值,如果無法修復給定dn**段,則y為」-1」。
資料範圍
1 ≤n
≤50
1≤n≤50
1≤n≤50
輸入樣例:
2aaa
aagaaag2a
tgtgaatg4a
gctagt
0輸出樣例:
case 1: 1
case 2: 4
case 3: -1
先定義dp函式,f(i
,j
)f(i,j)
f(i,j)
代表我們匹配到第i個位置,並且以tril樹上第j個位置結尾的答案。所以我們在跳到可以匹配到的字尾的位置之前來列舉當前的位置的字母來統計答案,如果當前位置和病毒對應的當前位置是不同的則可以+1否則不能。
#include
using
namespace std;
const
int n=
1005
;int ne[n]
,tar[n]
,tr[n][5
],cnt,n;
char str[n]
;int f[n]
[n];
queue<
int> q;
intget
(char c)
void
insert()
tar[p]=1
;}void
build()
}}}int
main()
build()
;scanf
("%s"
, str +1)
;int m =
strlen
(str +1)
;memset
(f,0x3f
,sizeof f)
; f[0]
[0]=
0;for(
int i =
0; i < m; i ++
)for
(int j =
0; j <= cnt; j ++
)for
(int k =
0; k <
4; k ++
)int res =
0x3f3f3f3f
;for
(int i =
0; i <= cnt; i ++
) res =
min(res, f[m]
[i]);if
(res ==
0x3f3f3f3f
) res =-1
;printf
("case %d: %d\n"
, t ++
, res);}
return0;
}
ac自動機與狀態轉移
ac自動機是乙個確定性有限狀態自動機 形式定義 定義 有限狀態自動機 fa finite automaton 是乙個五元組 m q,q0,f 其中,q 狀態的非空有窮集合。q q,q稱為m的乙個狀態。輸入字母表。狀態轉移函式,有時又叫作狀態轉換函式或者移動函式,q q,q,a p。q0 m的開始狀態...
ac自動機與狀態轉移
ac自動機是乙個確定性有限狀態自動機 形式定義 定義 有限狀態自動機 fa finite automaton 是乙個五元組 m q,q0,f 其中,q 狀態的非空有窮集合。q q,q稱為m的乙個狀態。輸入字母表。狀態轉移函式,有時又叫作狀態轉換函式或者移動函式,q q,q,a p。q0 m的開始狀態...
牛數 ac自動機 數字dp
給你n個數字串,定義牛數x n個數字串都不是x的子串。然後給你乙個長度為2000的數字s,問你 1,s 之間牛數有多少個。多個模式串匹配主串,就自然而然地會想到ac自動機了,然後問你 1,s 之間滿足條件的數的個數,那麼就是數字dp了,不過這裡的數字dp要在trie樹上跑,還要注意判斷前導零。inc...