結果
問題 | No.1646 Avoid Palindrome |
ユーザー |
|
提出日時 | 2021-08-13 22:11:47 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 184 ms / 3,000 ms |
コード長 | 5,479 bytes |
コンパイル時間 | 3,972 ms |
コンパイル使用メモリ | 195,772 KB |
最終ジャッジ日時 | 2025-01-23 19:38:35 |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 40 |
ソースコード
#include <iostream>#include <algorithm>#include <utility>#include <string>#include <vector>#include <set>#include <stack>#include <queue>#include <map>#include <math.h>#include <string.h>#include <iomanip>#include <numeric>#include <cstdlib>#include <cstdint>#include <cmath>#include <functional>#include <limits>#include <cassert>#include <bitset>#include <chrono>#include <random>#include <memory>#include <atcoder/all>/* macro */#define rep(i, a, n) for (int i = (int)(a); i < (int)(n); i++)#define rrep(i, a, n) for (int i = ((int)(n-1)); i >= (int)(a); i--)#define Rep(i, a, n) for (i64 i = (i64)(a); i< (i64)(n); i++)#define RRep(i, a, n) for (i64 i = ((i64)(n-i64(1))); i>=(i64)(a); i--)#define all(v) (v).begin(),(v).end()#define rall(v) (v).rbegin(),(v).rend()/* macro end *//* template */namespace ebi {#ifdef LOCAL#define debug(...) \std::cerr << "LINE: " << __LINE__ << " [" << #__VA_ARGS__ << "]:", \debug_out(__VA_ARGS__)#else#define debug(...)#endifvoid debug_out() { std::cerr << std::endl; }template <typename Head, typename... Tail>void debug_out(Head h, Tail... t) {std::cerr << " " << h;if (sizeof...(t) > 0) std::cout << " :";debug_out(t...);}template <typename T1, typename T2>std::ostream& operator<<(std::ostream& os, std::pair<T1, T2> pa) {return os << pa.first << " " << pa.second;}template <typename T>std::ostream& operator<<(std::ostream& os, std::vector<T> vec) {for (std::size_t i = 0; i < vec.size(); i++) os << vec[i] << (i + 1 == vec.size() ? "" : " ");return os;}std::ostream& operator<<(std::ostream& os, atcoder::modint1000000007 a){return os << a.val();}std::ostream& operator<<(std::ostream& os, atcoder::modint998244353 a){return os << a.val();}using size_t = std::size_t;using i64 = long long;using u64 = unsigned long long;template<class T> void fill(std::vector<T> &v) { for(T &e: v) std::cin >> e; }template<class T>struct Edge {int to;T cost;Edge(int to, T cost) : to(to), cost(cost) { }};template<class T>using Graph = std::vector<std::vector<Edge<T>>>;using graph = std::vector<std::vector<int>>;template <class T>inline bool chmin(T &a, T b) {if (a > b){a = b;return true;}return false;}template <class T>inline bool chmax(T &a, T b) {if (a < b){a = b;return true;}return false;}template <class T>T gcd(T a, T b){if( b==0 ) return a;else return gcd(b, a%b);}template <class T>T lcm(T a, T b) {return (a*b)/gcd(a,b);}template<class T>T pow(T x, i64 n) {T res = 1;while(n>0){if(n&1) res = res *x;x = x*x;n>>=1;}return res;}template<class T>T mod_pow(T x, i64 n, i64 mod) {T res = 1;while(n > 0) {if(n & 1) res = (res * x)%mod;x = (x*x)%mod;n >>= 1;}return res;}template<class T>T scan() {T val;std::cin >> val;return val;}constexpr i64 LNF = std::numeric_limits<i64>::max()/4;constexpr int INF = std::numeric_limits<int>::max()/4;const long double PI = acos(-1);const std::vector<int> dy = {1,0,-1,0,1,1,-1,-1};const std::vector<int> dx = {0,1,0,-1,1,-1,1,-1};}/* template end */namespace ebi {using ld = long double;using mint = atcoder::modint998244353;void main_() {constexpr int sz = 26;int n;std::string s;std::cin >> n >> s;std::vector dp(sz, std::vector<mint>(sz, 0));if(n == 1) {if(s[0] == '?') {std::cout << sz << std::endl;return;}else {std::cout << 1 << std::endl;return;}}if(s[0] == '?' && s[1] != '?') {rep(i,0,sz) {if(i == (s[1]-'a')) continue;dp[i][s[1]-'a']++;}}else if(s[0] != '?' && s[1] == '?') {rep(j,0,sz) {if(s[0]-'a' == j) continue;dp[s[0]-'a'][j]++;}}else if(s[0] == '?' && s[1] == '?') {rep(i,0,sz) {rep(j,0,sz) {dp[i][j]++;}}}else {if(s[0] == s[1]) {std::cout << 0 << std::endl;return;}dp[s[0]-'a'][s[1]-'a']++;}rep(p,2,n) {std::vector nxt(sz, std::vector<mint>(sz, 0));if(s[p] != '?') {rep(i,0,sz) {rep(j,0,sz) {if(i == j || i == (s[p]-'a') || j == (s[p]-'a')) continue;nxt[j][s[p]-'a'] += dp[i][j];}}dp = nxt;continue;}std::vector<mint> sum(sz, 0);rep(j,0,sz) {rep(k,0,sz) {if(k == j) continue;sum[j] += dp[k][j];}}rep(j,0,sz) {rep(k,0,sz) {nxt[j][k] = sum[j]-dp[k][j];}}dp = nxt;}mint ans = 0;rep(i,0,sz) {rep(j,0,sz) {if(i == j) continue;ans += dp[i][j];}}std::cout << ans.val() << std::endl;}}int main() {std::cout << std::fixed << std::setprecision(15);std::cin.tie(nullptr);std::ios::sync_with_stdio(false);int t = 1;while(t--) {ebi::main_();}return 0;}