結果

問題 No.2524 Stripes
ユーザー pockynypockyny
提出日時 2023-10-27 22:24:32
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 857 ms / 7,000 ms
コード長 1,795 bytes
コンパイル時間 3,136 ms
コンパイル使用メモリ 142,856 KB
実行使用メモリ 113,376 KB
最終ジャッジ日時 2024-09-25 14:27:38
合計ジャッジ時間 10,740 ms
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
6,812 KB
testcase_01 AC 2 ms
6,820 KB
testcase_02 AC 2 ms
6,940 KB
testcase_03 AC 417 ms
57,868 KB
testcase_04 AC 16 ms
6,940 KB
testcase_05 AC 249 ms
46,444 KB
testcase_06 AC 417 ms
57,636 KB
testcase_07 AC 693 ms
99,752 KB
testcase_08 AC 675 ms
100,144 KB
testcase_09 AC 127 ms
25,688 KB
testcase_10 AC 359 ms
54,144 KB
testcase_11 AC 15 ms
6,944 KB
testcase_12 AC 94 ms
16,616 KB
testcase_13 AC 765 ms
104,344 KB
testcase_14 AC 766 ms
104,476 KB
testcase_15 AC 766 ms
104,728 KB
testcase_16 AC 857 ms
113,376 KB
testcase_17 AC 600 ms
98,824 KB
testcase_18 AC 2 ms
6,940 KB
testcase_19 AC 2 ms
6,940 KB
testcase_20 AC 2 ms
6,940 KB
testcase_21 AC 2 ms
6,944 KB
testcase_22 AC 2 ms
6,940 KB
testcase_23 AC 2 ms
6,944 KB
testcase_24 AC 2 ms
6,944 KB
testcase_25 AC 2 ms
6,940 KB
testcase_26 AC 2 ms
6,944 KB
testcase_27 AC 2 ms
6,940 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <atcoder/segtree>
#include <atcoder/convolution>
#include <atcoder/modint>
#include <vector>
#include <string>

using namespace std;
using namespace atcoder;
using mint = modint998244353;
struct S{
    vector<mint> bb;
    vector<mint> bw;
    vector<mint> wb;
    vector<mint> ww;
    bool isE;
};

vector<mint> add(vector<mint> a,vector<mint> b){
    if(a.size()<b.size()) swap(a,b);
    vector<mint> c = a;
    for(int i=0;i<b.size();i++) c[i] += b[i];
    return c;
}

S op(S l,S r){
    if(l.isE) return r;
    if(r.isE) return l; 
    // bb
    vector<mint> bb = add(add(add(convolution(l.bb,r.wb),convolution(l.bw,r.bb)),l.bb),r.bb);

    // bw
    vector<mint> bw = add(add(add(convolution(l.bb,r.ww),convolution(l.bw,r.bw)),l.bw),r.bw);

    // wb
    vector<mint> wb = add(add(add(convolution(l.wb,r.wb),convolution(l.ww,r.bb)),l.wb),r.wb);

    // ww
    vector<mint> ww = add(add(add(convolution(l.wb,r.ww),convolution(l.ww,r.bw)),l.ww),r.ww);

    return {bb,bw,wb,ww};
}

S e(){
    vector<mint> v = {1};
    return {v,v,v,v,true};
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int i,n; cin >> n;
    string s; cin >> s;
    vector<S> v(n);
    vector<mint> bw = {0};
    vector<mint> wb = {0};
    for(i=0;i<n;i++){
        if(s[i]=='R'){
            vector<mint> bb = {0};
            vector<mint> ww = {0,1};
            v[i] = {bb,bw,wb,ww};
        }else{
            vector<mint> bb = {0,1};
            vector<mint> ww = {0};
            v[i] = {bb,bw,wb,ww};
        }
    }
    segtree<S,op,e> seg(v);
    S ans = seg.all_prod();
    vector<mint> ans2 = add(add(ans.bb,ans.bw),add(ans.wb,ans.ww));
    if(ans2.size()<n + 1) ans2.resize(n + 1);
    for(i=1;i<=n;i++){
        cout << ans2[i].val() << "\n";
    }
}
0