題意:
我們定義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,因...