加里敦大學的生物研究所,發現了決定人喜不喜歡吃藕的基因序列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 為根的有根樹,...