【发布时间】:2021-11-08 18:45:31
【问题描述】:
我是 C++ 编码新手,刚开始解决竞争性编程问题。我想解决以下任务:https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1620.
我想找到一个字符串的子字符串。问题是下面的代码很慢,我通过收到“time limit exceeded”“错误”导致提交失败。我可以做些什么来加快代码速度?
#include <iostream>
#include <sstream>
#include <stdio.h>
#include <string.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
stringstream ss;
string m;
char prob[100000];
char substring[1000];
int howManyCases = 0;
int numberOfTests = 0;
cin >> numberOfTests;
cin.ignore();
while(numberOfTests--)
{
cin >> prob >> howManyCases;
while(howManyCases--)
{
cin >> substring;
if (strstr(prob,substring)) {
ss << 'y' << "\n";
}
else
{
ss << 'n' << "\n";
}
}
}
m = ss.str();
cout << m;
return 0;
}
【问题讨论】:
-
我可以做些什么来加快代码速度? -- 报废代码,研究Boyer-Moore等算法。
-
您的字符数组太小。当
prob或1000的输入为 100000 个字符以找到子字符串时,这些数组中没有空终止符的空间。然后调用strstr会导致未定义的行为。一种可能性是strstr一直循环,因为它找不到字符串的终止符。我不会打赌,但仅此一项就可以解释为什么你会超时 -
std::search。第二件事是,您从那些竞争性编程网站获得的问题的措辞是这样的,因此总会有一种天真的方法来回答问题(例如您的尝试)。问题是这种简单的方法很容易编写,但由于超时和/或输入大小几乎总是会失败。这些问题的目的是看看您是否可以进行研究以找到非天真的解决方案,即使用更好的搜索算法,例如我已经提到的那些。
-
fwiw,我在上述评论中的结论是错误的。
cin >> prob不会将“太多”字符读入数组并且不会有 UB,但无论如何您的数组都太小了 1 个字符
标签: c++ optimization substring