blog.bouzuya.net

2023-07-19 bouzuya/genpi を書いている / ABC098 D を解いた

bouzuya/genpi を書いている。個人情報 (PI) を生成する何か。

とりあえず実行すると JSON で ほしいデータを出力する。

$ cargo run --quiet | jq .
{
  "date_of_birth": "1930-03-17",
  "first_name": "美香",
  "first_name_kana": "みか",
  "last_name": "森野",
  "last_name_kana": "もりの",
  "sex": "female"
}

とりあえず https://namegen.jp を適当にスクレイピングしたけど名前の生成は近いうちに自前でなんとかする。

「それ ChatGPT でできるよ」と言われると思いながら書いている。


  • Xor Sum 2 (AtCoder Beginner Contest 098:D問題) https://atcoder.jp/contests/abc098/tasks/arc098_b
    • https://atcoder.jp/contests/abc098/submissions/43734759
    • 尺取り法
    • XOR のほうが目について尺取りで良いのかパッと見で分かりづらい
    • SUM は A[r] だけ安定して大きくなり、 XOR は最大で A[r] だけ大きくなる
    • 右側だけ伸ばしても一度条件を満たさなくなれば満たせることはない (ここに気づくのが難しい)
    • 書籍の文脈がなかったら迷いそう
use proconio::input;

fn main() {
    input! {
        n: usize,
        a: [usize; n],
    };
    let mut xor = 0_usize;
    let mut sum = 0_usize;
    let mut count = 0_usize;
    let mut r = 0_usize;
    for l in 0..n {
        while (r < n) && (xor ^ a[r] == sum + a[r]) {
            xor ^= a[r];
            sum += a[r];
            r += 1;
        }
        count += r - l;
        if r == l {
            r += 1;
        } else {
            xor ^= a[l];
            sum -= a[l];
        }
    }
    let ans = count;
    println!("{}", ans);
}

今日のコミット。