TJOI2017 DNA 字尾陣列

2022-04-30 07:54:17 字數 1015 閱讀 7950

加里敦大學的生物研究所,發現了決定人喜不喜歡吃藕的基因序列s,

有這個序列的鹼基序列就會表現出喜歡吃藕的性狀,但是研究人員發現對鹼基序列s,任意修改其中不超過3個鹼基,依然能夠表現出吃藕的性狀。

現在研究人員想知道這個基因在dna鏈\(s_\)上的位置。

所以你需要統計在乙個表現出吃藕性狀的人的dna序列\(s_\)上,有多少個子串可能是該基因,

即有多少個\(s_\)的子串修改小於等於三個字母能夠變成s。

輸入格式:

第一行有乙個數t,表示有幾組資料

每組資料第一行乙個長度不超過\(10^\)的鹼基序列\(s_\)

每組資料第二行乙個長度不超過\(10^\)的吃藕基因序列s

輸出格式:

共t行,第i行表示第i組資料中,在\(s_\)中有多少個與s等長的連續子串可能是表現吃藕性狀的鹼基序列

輸入樣例#1: 

1atcgcccta

cttca

輸出樣例#1: 

2對於20%的資料,\(s_\),s的長度不超過\(10^\)

對於20%的資料,\(s_\),s的長度不超過\(10^\),0

作為字尾陣列的模板整合題來做的。

首先考慮乙個比較容易想到的事情.

\(s_\)大串中存在長度和\(s\)相同的串只有\(n\)個

因此只要乙個乙個暴力判斷就好了。

怎麼判斷快一點??

比如串'acgac'和串'acaac'

前面的'ac'相同,因此可以直接呼叫。

到了'g'和'a'不同,來乙個\(tim\)計數器表示失配了幾次,此時,\(tim++\)

接下了後面的'ac'相同,因此這個子串和模式串只有一處不同。

可以發現,每當\(tim<=3\)匹配完成一次時,\(ans++\)

那麼,怎麼得到'ac'相同這個過程??

用字尾陣列的lcp或者雜湊二分lcp或字尾樹跑lcp即可

字尾陣列複雜度\(o(n \log n + n * 6)\) = \(o(n \log n)\)

**在此

TJOI2017 DNA 字尾陣列求LCP

給定乙個文字串和乙個模式串,求文字串中有多少個連續的子串和模式串相差不超過三個字元。算是一道字尾陣列的模板題。直接做lcp,然後遇到匹配不上的就跳,跳的次數不能超過三次。具體地,將兩個字串連在一起,中間加乙個分隔符,然後求出height,用rmq維護height陣列的區間最小值即可。author y...

TJOI 2017 城市 題解

題目傳送門 題目大意 給一棵邊帶權的樹,你可以將一條邊換個位置,換完之後還得是一棵樹,要求換完之後樹的直徑最小。o n o n o n 做法太強了,只能想到 o n 2 o n 2 o n2 的做法 考慮列舉刪去哪一條邊,假如刪掉當前列舉的邊,那麼整棵樹會被分成兩個部分,然後我們要把這條邊重新找個位...

洛谷3761,TJOI2017城市

這道題一開始在想可以列舉每個點對,嘗試刪除其間的邊,因為有o n2 個點對,所以要o 1 更新答案 後來發現,因為是樹,所以只有o n 個點對是有用的 這麼顯然的結論一開始沒發現,看來還是我太弱了 然後就可以每次o n 判斷 首先定義在一棵樹 x 中,對於點y,f x,y 等於以 y 為根的有根樹,...