#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 4110, mod = 998244353;
int f[N][N];
bool check(string s) {
string t = s;
reverse(t.begin(), t.end());
return s == t;
// return 0;
}
int n, k;
string s;
string dogs(int x) {
string t;
for (int i = 0; i <= k; i++)
t = t + (char)(x % 2 + '0'), x /= 2;
reverse(t.begin(), t.end());
return t;
}
signed main() {
cin >> n >> k >> s;
s = ' ' + s;
// while (true) {
// int s;
// cin >> s;
// cout << dogs(s) << '\n';
// }
f[0][0] = 1;
for (int i = 1; i <= n; i++) {
if (s[i] == 'A' || s[i] == 'B') {
if (i <= k) {
for (int j = 0; j < (1ll << k); j++)
if (f[i - 1][j]) {
int k1 = j, k2 = j * 2 + s[i] - 'A';
// 从k1转移到k2
string now;
int k22 = k2;
for (int p = 1; p <= i; p++) {
now = now + (char)(k22 % 2 + 'A');
k22 /= 2;
}
if (i < k || !check(now))
f[i][k2] = (f[i][k2] + f[i - 1][k1]) % mod;
}
} else {
for (int j = 0; j < (1ll << k); j++) {
if (f[i - 1][j]) {
int k1 = j, k2 = j * 2 + s[i] - 'A';
// 取出 k2 的最高位
string tok2 = dogs(k2);
k2 = 0;
for (int i = 1; i < tok2.size(); i++)
k2 = k2 * 2 + tok2[i] - '0';
string now;
int k22 = k2;
for (int p = 1; p <= k; p++) {
now = now + (char)(k22 % 2 + 'A');
k22 /= 2;
}
if (!check(now))
f[i][k2] = (f[i][k2] + f[i - 1][k1]) % mod;
}
}
}
} else {
s[i] = 'A';
if (i <= k) {
for (int j = 0; j < (1ll << k); j++)
if (f[i - 1][j]) {
int k1 = j, k2 = j * 2 + s[i] - 'A';
// 从k1转移到k2
string now;
int k22 = k2;
for (int p = 1; p <= i; p++) {
now = now + (char)(k22 % 2 + 'A');
k22 /= 2;
}
if (i < k || !check(now))
f[i][k2] = (f[i][k2] + f[i - 1][k1]) % mod;
}
} else {
for (int j = 0; j < (1ll << k); j++) {
if (f[i - 1][j]) {
int k1 = j, k2 = j * 2 + s[i] - 'A';
string tok2 = dogs(k2);
k2 = 0;
for (int i = 1; i < tok2.size(); i++)
k2 = k2 * 2 + tok2[i] - '0';
string now;
int k22 = k2;
for (int p = 1; p <= k; p++) {
now = now + (char)(k22 % 2 + 'A');
k22 /= 2;
}
if (!check(now))
f[i][k2] = (f[i][k2] + f[i - 1][k1]) % mod;
// cout << "to " << j << ' ' << k2 << '\n';
}
}
}
s[i] = 'B';
if (i <= k) {
for (int j = 0; j < (1ll << k); j++)
if (f[i - 1][j]) {
int k1 = j, k2 = j * 2 + s[i] - 'A';
// 从k1转移到k2
// cout << "to " << k1 << ' ' << k2 << '\n';
string now;
int k22 = k2;
for (int p = 1; p <= i; p++) {
now = now + (char)(k22 % 2 + 'A');
k22 /= 2;
}
if (i < k || !check(now))
f[i][k2] = (f[i][k2] + f[i - 1][k1]) % mod;
}
} else {
for (int j = 0; j < (1ll << k); j++) {
if (f[i - 1][j]) {
int k1 = j, k2 = j * 2 + s[i] - 'A';
string tok2 = dogs(k2);
k2 = 0;
for (int i = 1; i < tok2.size(); i++)
k2 = k2 * 2 + tok2[i] - '0';
// cout << "dbg " << i << ' ' << j << ' ' << k1 << ' ' << k2 << '\n';
string now;
int k22 = k2;
for (int p = 1; p <= k; p++) {
now = now + (char)(k22 % 2 + 'A');
k22 /= 2;
}
if (!check(now))
f[i][k2] = (f[i][k2] + f[i - 1][k1]) % mod;
}
}
}
s[i] = '?';
}
// cout << "dbg : ";
// for (int j = 0; j < (1ll << k); j++) cout << f[i][j] << ' ';
// cout << '\n';
}
int ss = 0;
for (int i = 0; i < (1ll << k); i++)
ss = (ss + f[n][i]) % mod;
cout << ss << '\n';
return 0;
}
(注:这个代码能过,但是太长了太难写了)