jzoj 4876 基因突變

2021-07-25 03:28:00 字數 1916 閱讀 4762

description

**的707剛剛從白堊紀穿越回來,心中產生了乙個念頭:我要統治人類!

但是統治人類是很龐大且複雜的乙個工程,707嘗試了**,催眠,以及武裝鎮壓都沒能成功地統治人類,於是她決定從科學上對人類的基因進行研究從而達到他的目的。

707獲取了人類的基因資訊並嘗試對基因進行實驗。他發現可以把人類的基因看做乙個只包含小寫字母的字串,並定義從頭開始任意長度的基因為「源頭基因」人類身上與源頭基因完全匹配的片段越多,這個人就越容易被控制。於是707就開始了他**的計畫……

作為人類衛士的射手zmig自然不會讓707得逞,他決定拯救人類,現在他拿到了其中乙個人被改造後的基因,他想請你統計一下它的基因中究竟有多少基因片段是可以與源頭基因相匹配的

input

輸入乙個只包含小寫字母的字串s

output

輸出乙個整數,代表可以與源頭基因相匹配的基因片段數量。

sample input

【樣例輸入1】

aaba

【樣例輸入2】

niconiconi

sample output

【樣例輸出1】

6【樣例解釋1】

這六個片段分別為(1,1),(1,2),(1,3),(1,4),(2,2),(4,4)

【樣例輸出2】

18data constraint

對於30% 的資料,|s|<= 200

對於60% 的資料,|s|<= 2000

對於100%的資料,|s|<= 10^6

這道題乍一看,怎麼一眼kmp??

沒錯這就是kmp,而且還是類似的exkmp!!

比賽時還有人打sa!!不過可憐的被卡常只有80分了。

sa的常數太大了

真的是無奇不有。。。

而我比賽是則打得是二分+hash求最長公共字首

時間複雜度也是o(n log n)的。

有人說「sa 也是n log n」的為什麼沒過~~

你也不看看常數多大!!

還有另一種題解,就是kmp的:

相當於對於每個字首求有多少個字串和他相等

可以先求出 kmp 的 next 陣列,然後對於乙個位置,

每跳一次 next 就說明多了乙個合法的匹配。

乙個暴力方法是直接從每個節點開始跳統計答案。

顯然我們可以用 f[i]表示以 i 為結尾有多少組這樣的匹配,

然後可以發現 f[i]=f[next[i]]+1,這樣 o(n)掃一遍就可以了

墊底程式。。。o(n log n)

#include 

#include

#include

#include

#include

#define fo(i,a,b) for (int i=a;i<=b;i++)

#define n 1000005

using

namespace

std;

typedef

long

long ll;

const

int mo = 998244353;

char s[n];

ll ans = 0,pret[n],h[n];

int calc(int x,int y)

ll find(int l,int r)

return res;

}int main()

fo(i,1,n) ans += find(i,n);

printf("%lld\n",ans);

}

JZOJ 4876 基因突變

的707剛剛從白堊紀穿越回來,心中產生了乙個念頭 我要統治人類!但是統治人類是很龐大且複雜的乙個工程,707嘗試了 催眠,以及武裝鎮壓都沒能成功地統治人類,於是她決定從科學上對人類的基因進行研究從而達到他的目的。707獲取了人類的基因資訊並嘗試對基因進行實驗。他發現可以把人類的基因看做乙個只包含小寫...

字尾陣列 基因突變

描述 description 最近,jzyz的科學家忽然發現了一種神秘的生物出現在了霞棲湖中,通過提取dna,科學家發現這個生物的dna由a.z共26種鹼基對組成,而且這個生物常常容易發生dn 段的缺失。那麼問題來了。科學家想知道dn 段的缺失對這個生物會產生什麼影響。給你一段長為n的dna序列 保...

雙基因突變患者 警惕,這些基因突變,癌症術後易復發

手術是徹底 肺癌最主要的手段之一,但是為何一些臨床i期的肺癌手術切除的時候還是會出現 肺癌是我國發病率最高的惡性腫瘤,不過得益於大家關注度的提公升,一些肺癌高危人群使用低劑量螺旋ct來篩查早期肺癌,一些臨床i期肺癌可以被發現並使用手術的方式切除。如果說手術將所有的肺部腫瘤細胞都切除乾淨了,那麼肺癌就...