結果

問題 No.3458 Scores of Subsequence
コンテスト
ユーザー くらげ
提出日時 2026-01-06 00:28:58
言語 C++17
(gcc 15.2.0 + boost 1.89.0)
コンパイル:
g++-15 -O2 -lm -std=c++17 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
AC  
実行時間 12 ms / 2,000 ms
コード長 2,351 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 1,990 ms
コンパイル使用メモリ 215,084 KB
実行使用メモリ 7,848 KB
最終ジャッジ日時 2026-02-28 13:03:01
合計ジャッジ時間 3,428 ms
ジャッジサーバーID
(参考情報)
judge7 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 25
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using P = pair<ll,ll>;
#define rep(i,n) for(int (i) = 0; i<(n); i++)

const int max_n = 200000;

template<ll mod> struct modint{
    public:
    ll x;
    modint(ll x=0) : x((x%mod+mod)%mod) {}
    modint operator-() const { return modint(-x); }
    modint& operator+=(const modint& a){
        if(mod<=(x += a.x)) x-=mod;
        return *this;
    }
    modint& operator-=(const modint& a){
        if(mod<=(x+=mod-a.x)) x-=mod;
        return *this;
    }
    modint& operator*=(const modint& a){
        (x*=a.x)%=mod;
        return *this;
    }
    modint& operator++(){
        ++x;
        return *this;
    }
    modint operator++(int){
        modint temp = *this;
        x++;
        return temp;
    }
    modint& operator--(){
        --x;
        return *this;
    }
    modint operator--(int){
        modint temp = *this;
        x--;
        return temp;
    }
    modint pow(ll t) const{
        modint a=1,b=x;
        while(t){
            if(t&1) a*=b;
            b*=b;
            t/=2;
        }
        return a;
    }
    modint inv() const { return pow(mod-2); }
    modint& operator/=(const modint& a){ return (*this)*=a.inv(); }
    friend modint operator+(const modint& a, const modint& b) { return modint(a)+=b; }
    friend modint operator-(const modint& a, const modint& b) { return modint(a)-=b; }
    friend modint operator*(const modint& a, const modint& b) { return modint(a)*=b; }
    friend modint operator/(const modint& a, const modint& b) { return modint(a)/=b; }
    friend bool operator==(const modint& a, const modint& b) { return (modint(a).x==b.x); }
    friend bool operator!=(const modint& a, const modint& b) { return (modint(a).x!=b.x); }
    friend ostream& operator<<(ostream& os, const modint& m){ os << m.x; return os; }
    friend istream& operator>>(istream& is, modint& m){ is >> m.x; return is; }
};

using fp998=modint<998244353>;

int main(){
    string s;
    cin >> s;
    int n = s.size();

    // 制約
    assert(1<=n && n<=max_n);
    rep(i,n) assert(s[i]=='A' || s[i]=='M');

    // 3**n を前計算
    vector<fp998> p(n+5);
    p[0] = 1;
    rep(i,n+4) p[i+1] = p[i]*3;

    int cnt = 0;
    fp998 ans = 0;
    rep(i,n){
        if(s[i]=='M') cnt++;
        else ans += p[cnt];
    }
    cout << ans << endl;

}
0