请求卡常或者叉掉
查看原帖
请求卡常或者叉掉
513997
AmaoFox楼主2024/7/8 20:30
#include <bits/stdc++.h>
using namespace std;
const int maxw = 20 + 1, mod = 1e9, maxn = 3010 + 1;
struct BigInt {
    int len, a[maxw];
    BigInt operator +(BigInt x) {
        int l1 = len, l2 = x.len, r[maxw], anslen = max(l1, l2), c1, c2;
        BigInt ans;
        c1 = anslen - l1, c2 = anslen - l2, r[0] = 0;

        //      for(int i=1;i<=l1;i++) cout<<a[i]<<" ";
        //      cout<<endl;
        //      for(int i=1;i<=l2;i++) cout<<x.a[i]<<" ";
        //      cout<<endl;
        for (int i = anslen; i; i--)
            r[i] = ((i - c1 > 0 ? a[i - c1] : 0) + (i - c2 > 0 ? x.a[i - c2] : 0));

        //      for(int i=1;i<=anslen;i++) cout<<r[i]<<" ";
        //      cout<<endl;
        for (int i = anslen; i; i--)
            r[i - 1] += (r[i] / mod), r[i] %= mod;

        if (r[0]) {
            for (int i = 1; i <= anslen + 1; i++)
                ans.a[i] = r[i - 1];

            ans.len = anslen + 1;
            return ans;
        }

        ans.len = anslen;

        for (int i = 1; i <= anslen + 1; i++)
            ans.a[i] = r[i];

        return ans;
    }
    void input() {
        string s;
        int l;
        cin >> s, l = s.size(), s = " " + s;
        int cnt = 0;

        for (int i = l; i >= 1; i -= 9) {
            int ch = 0;

            for (int j = max(1, i - 8); j <= i; j++)
                ch = (ch * 10) + (s[j] - '0');

            a[++cnt] = ch;
        }

        reverse(a + 1, a + cnt + 1);
        len = cnt;
    }
    void output() {
        for (int i = 1; i <= len; i++) {
            if (i > 1)
                printf("%09d", a[i]);
            else
                printf("%d", a[i]);
        }
    }
} f[maxn][maxn];
int n, m, nxt[2][maxn][52], q;
string s[2];
vector<string> ans;
char id(int x) {
    if (x < 26)
        return x + 'A';
    else
        return (x - 26) + 'a';
}
void dfs(int z1, int z2, string now) {
    if (z1 == n + 1 || z2 == m + 1)
        return ;

    now += s[0][z1], ans.push_back(now);

    for (int i = 0; i < 52; i++)
        dfs(nxt[0][z1][i], nxt[1][z2][i], now);
}
void solve() {
    cin >> n >> m >> s[0] >> s[1] >> q, s[0] = " " + s[0], s[1] = " " + s[1];

    for (int j = 0; j < 52; j++)
        nxt[0][n][j] = n + 1, nxt[1][m][j] = m + 1;

    for (int i = n - 1; i >= 0; i--) {
        for (int j = 0; j < 52; j++)
            nxt[0][i][j] = (s[0][i + 1] == id(j) ? i + 1 : nxt[0][i + 1][j]);
    }

    for (int i = m - 1; i >= 0; i--) {
        for (int j = 0; j < 52; j++)
            nxt[1][i][j] = (s[1][i + 1] == id(j) ? i + 1 : nxt[1][i + 1][j]);
    }

    for (int i = 0; i <= n; i++)
        for (int j = 0; j <= m; j++)
            f[i][j].len = 1, f[i][j].a[1] = 0;

    f[0][0].len = 1, f[0][0].a[1] = 1;

    for (int i = 0; i <= n; i++) {
        for (int j = 0; j <= m; j++) {
            for (int c = 0; c < 52; c++)
                f[nxt[0][i][c]][nxt[1][j][c]] = f[nxt[0][i][c]][nxt[1][j][c]] + f[i][j];
        }
    }

    BigInt res;
    res.len = 1, res.a[1] = 1;

    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            res = res + f[i][j];

    if (q) {
        dfs(0, 0, ""), sort(ans.begin(), ans.end());

        for (string st : ans) {
            for (char ch : st)
                if (ch != ' ')
                    cout << ch;

            cout << endl;
        }
    }

    res.output();
}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int t = 1;

    //  cin>>t;
    while (t--)
        solve();

    return 0;
}

我认为我的做法的时间复杂度是 O(n2)O(n^2) 并且有个 2020 常数的压位高精。请帮忙检查代码中有无可以卡空间和时间常数的地方,或者指出我的做法中有复杂度可优化的地方,或者建议我重构代码。

2024/7/8 20:30
加载中...