結果
問題 | No.1740 Alone 'a' |
ユーザー |
![]() |
提出日時 | 2021-11-12 22:02:40 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 120 ms / 2,000 ms |
コード長 | 4,527 bytes |
コンパイル時間 | 2,196 ms |
コンパイル使用メモリ | 203,304 KB |
最終ジャッジ日時 | 2025-01-25 16:47:18 |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 38 |
ソースコード
#include <bits/stdc++.h>using namespace std;#define eps 1e-9#define INF 2000000000 // 2e9#define LLINF 2000000000000000000ll // 2e18 (llmax:9e18)#define all(x) (x).begin(), (x).end()#define sq(x) ((x) * (x))#define rep(i, x) for (int i = 0; i < (int)(x); i++)#define drep(i, x) for (int i = ((int)(x)-1); i >= 0; i--)#define popcount __builtin_popcount#define next __next#define prev __prev#ifndef LOCAL#define dmp(...) ;#else#define dmp(...) \cerr << "[ " << #__VA_ARGS__ << " ] : " << dump_str(__VA_ARGS__) << endl#endif// ---------------- Utility ------------------template <class T>bool chmin(T &a, const T &b) {if (a <= b) return false;a = b;return true;}template <class T>bool chmax(T &a, const T &b) {if (a >= b) return false;a = b;return true;}template <class T>using MaxHeap = priority_queue<T>;template <class T>using MinHeap = priority_queue<T, vector<T>, greater<T>>;template <class T>vector<T> vect(int len, T elem) {return vector<T>(len, elem);}// ----------------- Input -------------------template <class T, class U>istream &operator>>(istream &is, pair<T, U> &p) {return is >> p.first >> p.second;}template <class T>istream &operator>>(istream &is, vector<T> &vec) {for (int i = 0; i < vec.size(); i++) is >> vec[i];return is;}// ----------------- Output ------------------template <class T, class U>ostream &operator<<(ostream &os, const pair<T, U> &p) {return os << p.first << ',' << p.second;}template <class T>ostream &operator<<(ostream &os, const vector<T> &v) {for (const T &e : v) os << e << " ";return os;}template <class T>ostream &operator<<(ostream &os, const deque<T> &d) {for (const T &e : d) os << e << " ";return os;}template <class T>ostream &operator<<(ostream &os, const set<T> &s) {os << "{ ";for (const T &e : s) os << e << " ";return os << "}";}template <class T, class U>ostream &operator<<(ostream &os, const map<T, U> &m) {os << "{ ";for (const auto &[key, val] : m) os << "( " << key << " -> " << val << " ) ";return os << "}";}template <class TupleTy, size_t... I>void dump_tuple(ostream &os, const TupleTy t, std::index_sequence<I...>) {(..., (os << (I == 0 ? "" : ",") << std::get<I>(t)));}template <class... Args>ostream &operator<<(ostream &os, const tuple<Args...> &t) {os << "(";dump_tuple(os, t, std::make_index_sequence<sizeof...(Args)>());return os << ")";}void dump_str_rec(ostringstream &) {}template <class Head, class... Tail>void dump_str_rec(ostringstream &oss, Head &&head, Tail &&... tail) {oss << ", " << head;dump_str_rec(oss, forward<Tail>(tail)...);}template <class T, class... U>string dump_str(T &&arg, U &&... args) {ostringstream oss;oss << arg;dump_str_rec(oss, forward<U>(args)...);return oss.str();}// --------------- Fast I/O ------------------void fastio() {cin.tie(0);ios::sync_with_stdio(0);cout << fixed << setprecision(20);}// ------------------ ACL --------------------#include <atcoder/modint>constexpr int MOD = 998244353;// constexpr int MOD = 1000000007;using mint = atcoder::static_modint<MOD>;ostream &operator<<(ostream &os, const mint &v) {return os << v.val();}// ------------ End of template --------------#define endl "\n"using ll = long long;using pii = pair<int, int>;const bool multitest = false;void solve() {int N;string S;cin >> N >> S;auto dp = vect(N + 1, vect(2, vect(2, mint(0))));dp[0][1][0] = mint(1);for (int i = 0; i < N; i++) {{// tightfor (char c = 'a'; c <= S[i]; c++) {for (int k = 0; k < 2; k++) {int nj = (c == S[i]);int nk = k + (c == 'a' ? 1 : 0);if (nk > 1) continue;dp[i + 1][nj][nk] += dp[i][1][k];}}for (char c = 'a'; c <= 'z'; c++) {for (int k = 0; k < 2; k++) {int nk = k + (c == 'a' ? 1 : 0);if (nk > 1) continue;dp[i + 1][0][nk] += dp[i][0][k];}}}}mint ans = dp[N][0][1] + dp[N][1][1];int acnt = 0;for (int i = 0; i < N; i++)if (S[i] == 'a') acnt++;if (acnt == 1) ans -= mint(1);cout << ans << endl;return;}int main() {fastio();if (!multitest) {solve();} else {cerr << "[Warning] Multi testcase mode on" << endl;int t;cin >> t;while (t--) solve();}return 0;}