結果

問題 No.3500 01 String
コンテスト
ユーザー tikisan_
提出日時 2026-04-17 20:53:57
言語 Go
(1.26.1)
コンパイル:
env GOCACHE=/tmp go build _filename_
実行:
./Main
結果
WA  
実行時間 -
コード長 802 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 17,150 ms
コンパイル使用メモリ 284,160 KB
実行使用メモリ 13,824 KB
最終ジャッジ日時 2026-04-17 20:54:21
合計ジャッジ時間 19,289 ms
ジャッジサーバーID
(参考情報)
judge1_1 / judge2_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1 WA * 2
other AC * 3 WA * 17
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	var n int
	var a string
	reader := bufio.NewReader(os.Stdin)
	fmt.Fscan(reader, &n, &a)

	const mod = 998244353

	canZero := make([]bool, n)
	canOne := make([]bool, n)

	existsZero := false
	for i := 0; i < n; i++ {
		if a[i] == '0' {
			existsZero = true
		}
		canZero[i] = existsZero
	}

	existsOne := false
	for i := n - 1; i >= 0; i-- {
		if a[i] == '1' {
			existsOne = true
		}
		canOne[i] = existsOne
	}

	dp := make([][2]int, n+1)
	
	if canZero[0] {
		dp[1][0] = 1
	}
	if canOne[0] {
		dp[1][1] = 1
	}

	for i := 2; i <= n; i++ {
		idx := i - 1
		sumPrev := (dp[i-1][0] + dp[i-1][1]) % mod
		
		if canZero[idx] {
			dp[i][0] = sumPrev
		}
		if canOne[idx] {
			dp[i][1] = sumPrev
		}
	}

	fmt.Println((dp[n][0] + dp[n][1]) % mod)
}
0