社区讨论

出现MLE百思不得其解

P1470[IOI 1996 / USACO2.3] 最长前缀 Longest Prefix参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mhizm7qj
此快照首次捕获于
2025/11/03 18:18
4 个月前
此快照最后确认于
2025/11/03 18:18
4 个月前
查看原帖
经测试,21052*10^5个'A'字符无论理论还是实际输出都占用195KB空间,加上固定的其他数组怎么都用不了125MB,但#5会MLE,以下是提交代码
CPP
#include <bits/stdc++.h>
using namespace std;
string str("#"), p[205];
int l, ans, pi[205][15], f[205][200005], dp[200005];

int main() {
    ios::sync_with_stdio(false);
    cout.tie(0), cin.tie(0);
    do {
        cin >> p[++l];
        p[l] = "#" + p[l];
    } while (p[l][1] != '.');
    string s;
    while (cin >> s && s.length())
        str = str + s;
    for (int i = 1; i < l; ++i) {
        for (int j = 2, k = 0; j < p[i].length(); ++j) {
            while (k != 0 && p[i][k+1] != p[i][j]) k = pi[i][k];
            if (p[i][k+1] == p[i][j]) ++k;
            pi[i][j] = k;
        }
    }
    for (int i = 1; i < l; ++i) {
        for (int j = 1, k = 0; j < str.length(); ++j) {
            while (k != 0 && p[i][k+1] != str[j]) k = pi[i][k];
            if (p[i][k+1] == str[j]) ++k;
            f[i][j] = k;
        }
    }
    dp[0] = 1;
    for (int i = 1; i < str.length(); ++i) {
        for (int j = 1; j < l; ++j) {
            int len = p[j].length() - 1;
            if (i >= len && f[j][i] == len)
                dp[i] |= dp[i - len];
        }
    }
    for (int i = 1; i < str.length(); ++i)
        if (dp[i]) ans = i;
    cout << ans;
    return 0;
}
但仅将读入改成
CPP
for (; cin >> p[l] && p[l][0] != '.'; ++l)
  p[l] = "#" + p[l];
for (string s; cin >> s; str += s);
就可以通过,但#5仍会出现使用100MB左右空间,其他样例也有数十MB,求问这是为什么

回复

2 条回复,欢迎继续交流。

正在加载回复...