需要複製一段文字,具體來說給定一個字串 si,然後你有一個剪貼簿,初始為空,和一個初始為空的字串 t,然後對於所有 1 到 n 的 i,小水母會依次進行如下操作:
- "Ctrl + C" 操作,將剪貼簿的內容修改為 si。
- "Ctrl + V" 操作,將剪貼簿的內容新增到 t 末尾。
每次 "Ctrl + C" 操作和 "Ctrl + V" 操作都只有一半機率成功。求最終串 t 的期望權值,其定義為多少個子串只有一種字元。Q 次單點修改 si,你需要輸出每次修改後的答案。(n,Q<=2e5)
記得往簡單了想。
對於一個字元,最好是求以每個位置結尾,向前最長連續段期望長度。
(強制結尾思想的完全運用。)
列舉這個字元。對於每個位置 i,要求它必須 Ctrl-V,此時剪貼簿內字元顯然必須為 si,這個機率①容易計算。
//NOI-MRA-3004 zhouziqi
//pw[i]:=2**i
//ipw[i]:=pw[i]**(-1)
void DP(char c, int op) {
for (int i = 1; i <= n; i ++) {
sum[i] = sum[i - 1];
if (s[i] == c) {
add(sum[i], pw[i - 1]);
}
}
for (int i = 1, s0 = 0, s1 = 0; i <= n; i ++) {
int f = ((long long){sum[i]} * ipw[i + 1] //①
+ ((long long){sum[i]} * s0 + s1) % P * ipw[i << 1]) % P;
if (op > 0) {
add(ans, f);
} else {
add(ans, P - f);
}
int mul = (long long){pw[i]} * f % P;
add(s0, mul);
add(s1, (long long){pw[i] - sum[i] + P} * mul % P);
}
}