#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef vector VI; typedef pair PII; #define REP(i,s,t) for(int i=(s);i<(t);i++) #define FILL(x,v) memset(x,v,sizeof(x)) const int INF = (int)1E9; #define MAXN 30005 const int mod = 998244353; int n, cntq[MAXN], pow26[MAXN], dp[2][MAXN/2], dpPre[MAXN/2]; string s; int pairchar(int a, int b) { if (s[a] == '?' && s[b] == '?') return 26; else if (s[a] == '?' || s[b] == '?') return 1; else return s[a] == s[b]; } int ers = 0; int solve(int l, int r, int pt, int pr) { if (l > r) return 1; if (dp[pt][l] != -1 && r == pr) { return dp[pt][l]; } int ml = n - 1 - l, mr = n - 1 - r; int sol = l == r ? pairchar(l, mr) : pairchar(l, mr) * pairchar(r, ml); if (sol == 0) return dp[pt ^ 1][l] = 0; sol = (ll)sol * solve(l + 1, r - 1, pt, pr) % mod; return dp[pt ^ 1][l] = sol; } int main() { cin >> s; n = s.size(); REP(i,0,n) cntq[i] = (s[i] == '?') + (i ? cntq[i - 1] : 0); pow26[0] = 1; REP(i,1,n+1) pow26[i] = (ll)pow26[i - 1] * 26 % mod; int ans = pow26[cntq[n - 1]]; int t = 0; REP(r,0,n/2) { t ^= 1; FILL(dp[t], -1); dpPre[r] = 0; REP(l,0,r+1) { dpPre[r] += (ll)solve(l, r, t ^ 1, r - 1) * (l ? dpPre[l - 1] : 1) % mod; dpPre[r] %= mod; } int q = cntq[n - r - 2] - cntq[r]; ans += (ll)dpPre[r] * pow26[q] % mod; ans %= mod; } cout << ans << endl; return 0; }