#include #include using namespace std; const int MOD = 998244353; int dp[15005]; int getAmt(char a, char b) { if(a == '?' && b == '?') return 26; if(a == '?' || b == '?') return 1; if(a == b) return 1; return 0; } int n; string s; void force(int la, int ra, int lb, int rb) { int scale = 1; while(la >= 0 && ra < lb && rb < n) { scale = (scale * (long long)getAmt(s[la], s[lb])) % MOD; if(la != ra) scale = (scale * (long long)getAmt(s[ra], s[rb])) % MOD; if(scale == 0) break; dp[(rb-la+1)/2] += (scale * (long long)dp[(lb-ra)/2]) % MOD; if(dp[(rb-la+1)/2] >= MOD) dp[(rb-la+1)/2] -= MOD; la--; lb--; ra++; rb++; } } int main() { cin >> s; int origs = 1; if(s.size() % 2) { int mid = s[s.size()/2]; if(mid == '?') origs = 26; s = s.substr(0, s.size()/2) + s.substr(s.size()/2 + 1); } dp[0] = 1; n = s.size(); { int li = n/2-1; int ri = n/2; int curr = 1; int ni = 1; while(li >= 0 && ri < n && curr) { curr = (curr * (long long)(s[li--] == '?' ? 26 : 1)) % MOD; curr = (curr * (long long)(s[ri++] == '?' ? 26 : 1)) % MOD; dp[ni++] = curr; } } for(int lhs = 0; lhs < n/2; lhs++) { int li = (n/2-1) - (lhs); int ri = li + 2 * lhs + 1; force(li, li, ri, ri); force(li-1, li, ri, ri+1); } int ans = (origs * (long long)dp[n/2]) % MOD; cout << ans << "\n"; }