夢熊第二屆省選挑戰賽 T2 炫酷原神 genshin 唐氏記錄

Zaunese發表於2024-08-25

需要複製一段文字,具體來說給定一個字串 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);
    }
}

相關文章