結果

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

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
4,348 KB
testcase_01 AC 2 ms
4,348 KB
testcase_02 AC 2 ms
4,348 KB
testcase_03 AC 444 ms
58,020 KB
testcase_04 AC 16 ms
6,360 KB
testcase_05 AC 247 ms
46,560 KB
testcase_06 AC 417 ms
57,624 KB
testcase_07 AC 707 ms
99,784 KB
testcase_08 AC 705 ms
100,320 KB
testcase_09 AC 128 ms
25,740 KB
testcase_10 AC 361 ms
54,156 KB
testcase_11 AC 16 ms
6,256 KB
testcase_12 AC 94 ms
16,792 KB
testcase_13 AC 794 ms
104,260 KB
testcase_14 AC 765 ms
104,388 KB
testcase_15 AC 790 ms
104,648 KB
testcase_16 AC 887 ms
113,316 KB
testcase_17 AC 600 ms
98,844 KB
testcase_18 AC 2 ms
4,348 KB
testcase_19 AC 2 ms
4,348 KB
testcase_20 AC 2 ms
4,348 KB
testcase_21 AC 2 ms
4,348 KB
testcase_22 AC 2 ms
4,348 KB
testcase_23 AC 2 ms
4,348 KB
testcase_24 AC 2 ms
4,348 KB
testcase_25 AC 2 ms
4,348 KB
testcase_26 AC 2 ms
4,348 KB
testcase_27 AC 2 ms
4,348 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