阿里「天池」競賽平臺近日推出了一個新的挑戰任務:對於給定的一串 DNA 鹼基序列 tt,判斷它在另外一個根據規則生成的 DNA 鹼基序列 ss中出現了多少次。python
其中 ∧ 表示「且」關係,∨ 表示「或」關係,a mod}\ ba mod b 表示 aa 除以 bb 的餘數。app
現給定另外一個 DNA 鹼基序列 tt,以及生成 ss 的參數 n , a , b , L , Rn,a,b,L,R,求 tt 在 ss 中出現了多少次。spa
數據第一行爲 55 個整數,分別表明 n , a , b , L , Rn,a,b,L,R。第二行爲一個僅包含A
、T
、G
、C
的一個序列 tt。code
數據保證 0 < a < n,0<a<n, 0 \le b < n,0≤b<n, 0 \le L \le R < n,0≤L≤R<n, |t| \le 10^{6}∣t∣≤106,a,na,n 互質。input
對於簡單版本,1 \leq n \leq 10^{6}1≤n≤106;it
對於中等版本,1 \leq n \leq 10^{9}, a = 11≤n≤109,a=1;class
對於困難版本,1 \leq n \leq 10^{9}1≤n≤109。import
輸出一個整數,爲 tt 在 ss 中出現的次數。im
對於第一組樣例,生成的 ss 爲TTTCGGAAAGGCC
。數據
13 2 5 4 9 AGG
1
103 51 0 40 60 ACTG
5
import re arguments = [int(c) for c in raw_input().split(" ")] pattern = raw_input() n = arguments[0] a = arguments[1] b = arguments[2] L = arguments[3] R = arguments[4] w = [b] for i in range(1,n): w.append((w[i-1]+a)%n) def generate_s(a,b,L,R): s = "" for i in range(n): if w[i] % 2 == 0: if L <= w[i] <= R: s += "A" else: s += "G" else: if L <= w[i] <= R: s += "T" else: s += "C" return s ss = generate_s(a,b,L,R) number = 0 while ss != "": if ss.find(pattern) != -1: number += 1 s = s[s.find(pattern)+1:] else: break