社区讨论
出现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 个月前
经测试,个'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;
}
但仅将读入改成
CPPfor (; cin >> p[l] && p[l][0] != '.'; ++l)
p[l] = "#" + p[l];
for (string s; cin >> s; str += s);
就可以通过,但#5仍会出现使用100MB左右空间,其他样例也有数十MB,求问这是为什么
回复
共 2 条回复,欢迎继续交流。
正在加载回复...