SDOI2019 連續子串行

2022-05-19 02:50:04 字數 1281 閱讀 3232

題意:

我們定義tm序列為如下形式的布林序列:

tm序列是乙個無限長度的序列,它有很多連續子串行。

現在給定乙個布林序列s和乙個非負整數k

,請統計一下一共有多少種tm序列的連續子串行t滿足:

$資料組數t\leq 100,|s|\leq 100,k\leq 10^$。

題解:神仙詐騙題。

該序列的生成方式有無數種,我一開始想的是每次取反拼在後面,但好像沒什麼操作空間。

注意到k的範圍是$10^$,這個資料範圍要麼是$o(1)$要麼是$o(\log)$。

發現自己不會$o(1)$,於是考慮$o(\log)$,也就是每次把長度壓縮成原來的一半。

考慮該序列的另外乙個生成方式:每次將0替換成01,將1替換成10。我們反著做這個操作即可壓縮序列。

雖然這k個空填啥都行,但仔細想一下,縮的過程中它們都會跟某個確定的元素配對一次,實際上沒有累加貢獻。

注意每次縮的時候都有兩種情況:把第乙個元素跟前面/後面配對,在$n\leq 3$的時候還得特判一下。

複雜度$o(\log)$,因為每個串最後只能縮成乙個串。

套路:**:

#include#define maxn 100005

#define maxm 500005

#define inf 0x7fffffff

#define mod 1000000009

#define ll long long

#define mp make_pair

#define rint register int

#define debug(x) cerr<

namespace

std;

mapstring,ll>,ll>dp;

string

s;inline ll read()

inline ll solve(

string

s,ll k)

}if(flag) res=(res+solve(ns,(n&1)?(k>>1):((k+1)>>1)))%mod;

flag=1,ns=((s[0]-'

0')^1)+'0'

;

for(rint i=1;i2

) }

if(flag) res=(res+solve(ns,(n&1)?((k+1)>>1):(k>>1)))%mod;

return dp[mp(s,k)]=res;

}int

main()

return0;

}

連續子串行

子串行2 連續子陣列的最大和

子陣列,這個題一開始肯定想到用滑動視窗,但它的陣列有負數,所以不知道往哪移動,只能用動態規劃。用f i 表示以i結尾的最大和陣列,則要找的就是max f i 為什麼不用f i 表示0到i的最大和,因為沒法用f i 1 推出f i f i 1 不一定包括num i 1 所以f i max num i ...

SXOJ854 連續子串行的和

這個題目涉及到演算法 尺取法,貼一篇神犇關於尺取法的博文 尺取法 尺取法就像是在數列上放一條蜷著身體的毛毛蟲,當滿足條件時取值區間 毛毛蟲 的l指標和r指標發生改變,就像一條在蠕動的毛毛蟲一樣,所以我覺得叫毛毛蟲爬法才更形象 霧 這個題目的做法就是先求各項的字首和,然後對字首和進行排序,使用尺取法對...

(7)連續子陣列問題

include using namespace std 輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。要求時間複雜度為o n 例如輸入的陣列為1,2,3,10,4,7,2,5,和最大的子陣列為3,10,4,7,2,因...