計蒜客 阿里天池的新任務 簡單 KMP輕鬆水

2021-08-20 22:20:10 字數 1850 閱讀 1850

阿里「天池」競賽平台近日推出了乙個新的挑戰任務:對於給定的一串 dna 鹼基序列 t

t,判斷它在另乙個根據規則生成的 dna 鹼基序列 s

s中出現了多少次。

首先,定義乙個序列 ww:

\displaystyle w_ = =⎧

⎩⎨⎪⎪

⎪⎪⎪⎪

a,t,

g,c,

(l≤w

i≤r)

∧(wi

mod2

=0)(

l≤wi

≤r)∧

(wim

od2=

1)((

wi∨(wi

>r)

)∧(w

imod

2=0)

((wi

∨(wi

>r)

)∧(w

imod

2=1)

\ bamo

db表示 a

a 除以 b

b 的餘數。

現給定另乙個 dna 鹼基序列 t

t,以及生成 s

s 的引數 n , a , b , l , rn,

a,b,

l,r,求 t

t 在 s

s 中出現了多少次。

資料第一行為 5

5 個整數,分別代表 n , a , b , l , rn,

a,b,

l,r。第二行為乙個僅包含atgc的乙個序列 tt。

資料保證 0 < a < n,

0<

a0 \le b < n,0≤

b0 \le l \le r < n,0≤

l≤r|t| \le 10^∣t

∣≤10

​6​​

,a,na,

n 互質。

對於簡單版本,1 \leq n \leq 10^1≤

n≤10

​6​​

;對於中等版本,1 \leq n \leq 10^, a = 11≤

n≤10

​9​​

,a=1

;對於困難版本,1 \leq n \leq 10^1≤

n≤10

​9​​

。輸出乙個整數,為 t

t 在 s

s 中出現的次數。

對於第一組樣例,生成的 s

s 為tttcggaaaggcc

樣例輸入1

13 2 5 4 9

agg

樣例輸出1

1

樣例輸入2

103 51 0 40 60

actg

樣例輸出2

5模擬一遍題意 進行kmp演算法 統計個數即可

#include #include #include #include #include using namespace std;

const int max_n = 1e6+5;

int next[max_n];

char mo[max_n];

char str[max_n];

int w[max_n];

int n2,n1;

void getnext()

else if(w[i]%2==0)

}else if(w[i]r)

else if(w[i]%2==1)}}

next[0]=-1;

getnext();

printf("%d\n",kmp());

return 0;

}

計蒜客 阿里的新遊戲

阿里九遊開放平台近日上架了一款新的益智類遊戲 成三棋。成三棋是我國非常古老的乙個雙人棋類遊戲,其棋盤如下圖所示 如果一條線段上的三個交叉點都被同一玩家的棋子佔據的話,則稱這條線段被該玩家 成三。現在,小紅和小明兩人在遊戲平台上下棋,其中小紅的棋子是黑色的。請你幫小紅計算他成三的線段數。樣例對應的棋盤...

計蒜客 2019計蒜之道D

題意 現在給定你乙個字串 s ss 以及乙個整數 k kk,請求出 s ss的字典序最小的長度為 k kk的子串行。資料範圍 0 s 5000000 00 s 5000 000 樣例輸入 helloworld 5樣例輸出 ellld思路 假如我們先不考慮長度為k的限制我們應當怎麼做?我們以樣例為例子...

計蒜客 解碼

蒜頭君自己發明了一種字串的編碼方式,對於只含有大小寫字母的字串,可以用數字來表示括號裡面的串連續出現的次數 數字有可能超過一位數 比如a abcd 2等價於aabcdabcd。特別地,如果數字前面沒有括號,表示緊貼數字的前面的 乙個字母 出現的次數。比如abc2表示abcc。為了降低解碼的難度,蒜頭...