求 D 题简单写法(删除板子<2K)
  • 板块学术版
  • 楼主ttq012
  • 当前回复18
  • 已保存回复18
  • 发布时间2024/6/22 21:44
  • 上次更新2024/6/23 14:25:26
查看原帖
求 D 题简单写法(删除板子<2K)
378467
ttq012楼主2024/6/22 21:44
#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;
}

(注:这个代码能过,但是太长了太难写了)

2024/6/22 21:44
加载中...