結果
問題 | No.2219 Re:010 |
ユーザー | aplysiaSheep |
提出日時 | 2023-04-20 17:07:15 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 84 ms / 2,000 ms |
コード長 | 14,065 bytes |
コンパイル時間 | 4,975 ms |
コンパイル使用メモリ | 281,480 KB |
実行使用メモリ | 6,824 KB |
最終ジャッジ日時 | 2024-10-15 14:12:28 |
合計ジャッジ時間 | 6,489 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,248 KB |
testcase_02 | AC | 2 ms
5,248 KB |
testcase_03 | AC | 49 ms
6,400 KB |
testcase_04 | AC | 7 ms
5,248 KB |
testcase_05 | AC | 37 ms
5,760 KB |
testcase_06 | AC | 10 ms
5,248 KB |
testcase_07 | AC | 22 ms
5,248 KB |
testcase_08 | AC | 45 ms
6,144 KB |
testcase_09 | AC | 43 ms
6,144 KB |
testcase_10 | AC | 33 ms
5,632 KB |
testcase_11 | AC | 27 ms
5,248 KB |
testcase_12 | AC | 28 ms
5,248 KB |
testcase_13 | AC | 55 ms
6,824 KB |
testcase_14 | AC | 56 ms
6,784 KB |
testcase_15 | AC | 56 ms
6,816 KB |
testcase_16 | AC | 56 ms
6,784 KB |
testcase_17 | AC | 55 ms
6,784 KB |
testcase_18 | AC | 8 ms
6,784 KB |
testcase_19 | AC | 13 ms
6,784 KB |
testcase_20 | AC | 84 ms
6,784 KB |
testcase_21 | AC | 2 ms
5,248 KB |
testcase_22 | AC | 2 ms
5,248 KB |
testcase_23 | AC | 2 ms
5,248 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; #include <atcoder/all> using namespace atcoder; #define int long long // #define endl "\n" #pragma GCC optimize("-O3") void solve(); typedef long long ll; typedef unsigned long long ull; typedef double db; typedef long double ld; typedef pair<int, int> pi; typedef pair<int, pair<int, int>> pip; typedef vector<int> vi; typedef vector<double> vd; typedef vector<bool> vb; typedef vector<string> vs; typedef vector<char> vc; typedef vector<pair<int, int>> vp; typedef vector<vector<int>> vvi; typedef vector<vector<double>> vvd; typedef vector<vector<bool>> vvb; typedef vector<vector<string>> vvs; typedef vector<vector<char>> vvc; typedef vector<vector<pair<int, int>>> vvp; typedef vector<vector<vector<int>>> vvvi; typedef vector<vector<vector<vector<int>>>> vvvvi; template <typename T> using vv = vector<vector<T>>; template <typename T> using vvv = vector<vector<vector<T>>>; template <typename T> using vvvv = vector<vector<vector<vector<T>>>>; template <typename T> using pq = priority_queue<T>; template <typename T> using pqg = priority_queue<T, vector<T>, greater<T>>; #define _PI 3.14159265358979323846 #define _E 2.7182818284590452354 #define fi first #define se second #define mset multiset #define uset unordered_set #define umap unordered_map #define pb push_back #define eb emplace_back #define mp make_pair #define td typedef #define elif else if #define ifnot(x) if(!(x)) #define all(obj) (obj).begin(), (obj).end() #define rall(obj) (obj).rbegin(), (obj).rend() #define sumv(a) accumulate(all(a), 0LL) #define lb(v, a) (lower_bound(begin(v), end(v), a) - begin(v)) #define ub(v, a) (upper_bound(begin(v), end(v), a) - begin(v)) #define inr(x, l, r) (l <= x && x < r) #define cbit(x) __builtin_popcountll(x) #define topbit(t) (t == 0 ? -1 : 63 - __builtin_clzll(t)) #define botbit(t) (t == 0 ? 64 : __builtin_ctzll(t)) #define gbit(msk, i) ((msk) >> (i)&1) #define mask(x) ((1LL << (x)) - 1) #define rep1(a) for(int i = 0; i < (int)a; i++) #define rep2(i, a) for(int i = 0; i < (int)a; i++) #define rep3(i, a, b) for(int i = a; i < (int)b; i++) #define rep4(i, a, b, c) for(int i = a; i < (int)b; i += c) #define overload4(a, b, c, d, e, ...) e #define rep(...) overload4(__VA_ARGS__, rep4, rep3, rep2, rep1)(__VA_ARGS__) #define rrep1(n) for(ll i = n; i--;) #define rrep2(i, n) for(ll i = n; i--;) #define rrep3(i, a, b) for(ll i = b; i-- > (a);) #define rrep4(i, a, b, c) \ for(ll i = (a) + ((b) - (a)-1) / (c) * (c); i >= (a); i -= c) #define rrep(...) \ overload4(__VA_ARGS__, rrep4, rrep3, rrep2, rrep1)(__VA_ARGS__) #define fore1(i, a) for(auto &&i : a) #define fore2(x, y, a) for(auto &&[x, y] : a) #define fore3(x, y, z, a) for(auto &&[x, y, z] : a) #define fore(...) overload4(__VA_ARGS__, fore3, fore2, fore1)(__VA_ARGS__) istream &operator>>(istream &is, modint998244353 &a) { long long v; is >> v; a = v; return is; } ostream &operator<<(ostream &os, const modint998244353 &a) { return os << a.val(); } istream &operator>>(istream &is, modint1000000007 &a) { long long v; is >> v; a = v; return is; } ostream &operator<<(ostream &os, const modint1000000007 &a) { return os << a.val(); } template <class T, class U> istream &operator>>(istream &is, pair<T, U> &p) { is >> p.first >> p.second; return is; } template <class T, class U> ostream &operator<<(ostream &os, const pair<T, U> &p) { os << p.first << "," << p.second; return os; } template <class T> ostream &operator<<(ostream &s, set<T> P) { fore(it, P) { s << it << " "; } return s; } template <class T1, class T2> ostream &operator<<(ostream &s, map<T1, T2> P) { fore(x, y, P) { s << "<" << x << "->" << y << "> "; } return s; } template <class T> ostream &operator<<(ostream &s, multiset<T> P) { fore(it, P) { s << it << " "; } return s; } template <class T> ostream &operator<<(ostream &s, unordered_set<T> P) { fore(it, P) { s << it << " "; } return s; } template <class T1, class T2> ostream &operator<<(ostream &s, unordered_map<T1, T2> P) { fore(x, y, P) { s << "<" << x << "->" << y << "> "; } return s; } template <class T> istream &operator>>(istream &is, vector<T> &v) { for(auto &e : v) is >> e; return is; } template <class T> ostream &operator<<(ostream &os, const vector<T> &v) { for(auto &e : v) os << e << ' '; return os; } template <class T> ostream &operator<<(ostream &os, const vector<vector<T>> &v) { for(auto &e : v) { for(auto &c : e) os << c << ' '; os << endl; } return os; } template <class T> vector<T> &operator++(vector<T> &v) { for(auto &e : v) e++; return v; } template <class T> vector<T> operator++(vector<T> &v, signed) { auto res = v; for(auto &e : v) e++; return res; } template <class T> vector<T> &operator--(vector<T> &v) { for(auto &e : v) e--; return v; } template <class T> vector<T> operator--(vector<T> &v, signed) { auto res = v; for(auto &e : v) e--; return res; } // debug methods // usage: debug(x,y); #define CHOOSE(a) CHOOSE2 a #define CHOOSE2(a0, a1, a2, a3, a4, x, ...) x #define debug_1(x1) cout << #x1 << ": " << x1 << endl #define debug_2(x1, x2) \ cout << #x1 << ": " << x1 << ", " #x2 << ": " << x2 << endl #define debug_3(x1, x2, x3) \ cout << #x1 << ": " << x1 << ", " #x2 << ": " << x2 << ", " #x3 << ": " \ << x3 << endl #define debug_4(x1, x2, x3, x4) \ cout << #x1 << ": " << x1 << ", " #x2 << ": " << x2 << ", " #x3 << ": " \ << x3 << ", " #x4 << ": " << x4 << endl #define debug_5(x1, x2, x3, x4, x5) \ cout << #x1 << ": " << x1 << ", " #x2 << ": " << x2 << ", " #x3 << ": " \ << x3 << ", " #x4 << ": " << x4 << ", " #x5 << ": " << x5 << endl #ifdef _DEBUG #define debug(...) \ CHOOSE((__VA_ARGS__, debug_5, debug_4, debug_3, debug_2, debug_1, ~)) \ (__VA_ARGS__) #else #define debug(...) #endif void out() { cout << endl; } template <class T> void out(const T &a) { cout << a; cout << endl; } template <class T, class... Ts> void out(const T &a, const Ts &...b) { cout << a; (cout << ... << (cout << ' ', b)); cout << endl; } struct fast_ios { fast_ios() { cin.tie(nullptr); ios::sync_with_stdio(false); cout << fixed << setprecision(12); }; } fast_ios_; struct RandomNumberGenerator { mt19937 mt; RandomNumberGenerator() : mt(chrono::steady_clock::now().time_since_epoch().count()) {} long long operator()(long long a, long long b) { // [a, b) uniform_int_distribution<long long> dist(a, b - 1); return dist(mt); } long long operator()(long long b) { // [0, b) return (*this)(0, b); } long long operator()() { return (*this)(0, 1LL << 60); } double operator[](double a) { return (double)(*this)(0, 1LL << 60) / (1LL << 60) * a; } } rnd; clock_t start_time = clock(); double now_time() { clock_t end_time = clock(); return (double)(end_time - start_time) / CLOCKS_PER_SEC; } vector<int> vec(int a, int x) { return vector<int>(a, x); } vector<vector<int>> vec(int a, int b, int x) { return vector<vector<int>>(a, vec(b, x)); } vector<vector<vector<int>>> vec(int a, int b, int c, int x) { return vector(a, vec(b, c, x)); } vector<vector<vector<vector<int>>>> vec(int a, int b, int c, int d, int x) { return vector(a, vec(b, c, d, x)); } vector<vector<vector<vector<vector<int>>>>> vec(int a, int b, int c, int d, int e, int x) { return vector(a, vec(b, c, d, e, x)); } void input_graph(vector<vector<int>> &g, int m = -1, int bidirected = true) { if(m == -1) m = g.size() - 1; for(int i = 0; i < m; i++) { int u, v; cin >> u >> v; u--; v--; g[u].push_back(v); if(bidirected) g[v].push_back(u); } } vector<int> iota(int n, int s = 0) { vi a(n); iota(a.begin(), a.end(), s); return a; } template <class T> void sort(vector<T> &v) { sort(all(v)); } template <class T> void rsort(vector<T> &v) { sort(rall(v)); } template <class T> void reverse(T &v) { reverse(all(v)); } template <class T> auto max(const T &a) { return *max_element(all(a)); } template <class T> auto min(const T &a) { return *min_element(all(a)); } long long max(signed x, long long y) { return max((long long)x, y); } long long max(long long x, signed y) { return max(x, (long long)y); } long long min(signed x, long long y) { return min((long long)x, y); } long long min(long long x, signed y) { return min(x, (long long)y); } template <class T, class S> bool chmax(T &a, const S &b) { if(a < (T)b) { a = (T)b; return 1; } return 0; } template <class T, class S> bool chmin(T &a, const S &b) { if((T)b < a) { a = (T)b; return 1; } return 0; } template <class T> vector<T> uniq(vector<T> v) { sort(v.begin(), v.end()); v.erase(unique(v.begin(), v.end()), v.end()); return v; } template <class T> vector<T> compress(vector<T> v) { vector<T> v2(v.size()); v2 = v; sort(v.begin(), v.end()); v.erase(unique(v.begin(), v.end()), v.end()); for(int i = 0; i < (int)v2.size(); i++) { v2[i] = lower_bound(v.begin(), v.end(), v2[i]) - v.begin(); } return v2; } template <typename T> vector<T> acc0(vector<T> &v) { vector<T> res(v.size()); if((int)v.size() == 0) return res; res[0] = v[0]; for(int i = 1; i < (int)v.size(); i++) { res[i] = res[i - 1] + v[i]; } return res; } template <typename T> vector<T> acc1(vector<T> &v) { vector<T> res(v.size() + 1); for(int i = 0; i < (int)v.size(); i++) { res[i + 1] = res[i] + v[i]; } return res; } template <typename T> vector<vector<T>> acc0(vector<vector<T>> v) { int h = v.size(), w = v[0].size(); for(int i = 0; i < h; i++) { for(int j = 1; j < w; j++) { v[i][j] += v[i][j - 1]; } } for(int i = 1; i < h; i++) { for(int j = 0; j < w; j++) { v[i][j] += v[i - 1][j]; } } return v; } template <typename T> vector<vector<T>> acc1(vector<vector<T>> &v) { int h = v.size(), w = v[0].size(); vector<vector<T>> res(h + 1, vector<T>(w + 1)); for(int i = 0; i < h; i++) { for(int j = 0; j < w; j++) { res[i + 1][j + 1] = v[i][j] + res[i + 1][j]; } } for(int i = 0; i < h; i++) { for(int j = 0; j < w; j++) { res[i + 1][j + 1] += res[i][j + 1]; } } return res; } long long exp(long long x, int n) { long long res = 1; while(n > 0) { if(n & 1) res = res * x; x = x * x; n >>= 1; } return res; } constexpr long long two(int n) { return 1LL << n; } constexpr long long ten(int n) { return n == 0 ? 1 : ten(n - 1) * 10; } int countDigits(long long n) { string tmp = to_string(n); return (int)tmp.size(); } long long sq(long long n) { return n * n; } long long ceil(long long x, long long y) { return (x + y - 1) / y; } long long floor(long long x, long long y) { return (y < 0 ? floor(-x, -y) : (x > 0 ? x / y : x / y - (x % y == 0 ? 0 : 1))); } constexpr long long tri(long long n) { return n * (n + 1) / 2; } // l + ... + r constexpr long long tri(long long l, long long r) { return (l + r) * (r - l + 1) / 2; } int ctoi(const char &c, const char start = '0') { return c - start; } int atoi(const char &c, const char start = 'a') { return c - start; } vector<int> ctoi(string &s, const char start = '0') { vector<int> res; for(auto &c : s) { int x = c - start; if(x < 0 || x >= 10) x = -1; res.push_back(x); } return res; } vector<int> atoi(string &s, const char start = 'a') { vector<int> res; for(auto &c : s) { int x = c - start; if(x < 0 || x >= 26) x = -1; res.push_back(x); } return res; } void yes() { cout << "Yes" << endl; } void no() { cout << "No" << endl; } void yesno(bool x) { if(x) yes(); else no(); } void err() { cout << -1 << endl; } int dx[] = {1, 0, -1, 0, 1, 1, -1, -1}; int dy[] = {0, 1, 0, -1, -1, 1, 1, -1}; long long inf = 1LL << 61; double eps = 1e-9; // long long mod = 67280421310721; // using mint = static_modint<1000000009>; // using mint = dynamic_modint<1000000009>; // long long mod = 1000000007; // using mint = modint1000000007; long long mod = 998244353; using mint = modint998244353; typedef vector<mint> vm; typedef vector<vector<mint>> vvm; typedef vector<vector<vector<mint>>> vvvm; //////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// signed main() { int testcase = 1; // cin >> testcase; for(int i = 0; i < testcase; i++) { solve(); } } void solve() { string s; cin >> s; int n = s.size(); fenwick_tree<int> bit1(n); fenwick_tree<int> bit2(n); rep(i, n) { if(s[i] == '0') bit1.add(i, 1); if(s[i] == '?') bit2.add(i, 1); } mint ans = 0; rep(i, n) { if(s[i] == '0') continue; int n1 = bit1.sum(0, i); int n2 = bit2.sum(0, i); mint s1; if(n2 == 0) s1 = n1; else s1 = mint{2}.pow(n2) * n1 + mint{2}.pow(n2 - 1) * n2; n1 = bit1.sum(i + 1, n); n2 = bit2.sum(i + 1, n); mint s2; if(n2 == 0) s2 = n1; else s2 = mint{2}.pow(n2) * n1 + mint{2}.pow(n2 - 1) * n2; ans += s1 * s2; } out(ans); }