我试图解决来自acm.timus.ru的这个问题,基本上要求我输出给定字符串(最大长度为5000)的不同子字符串数量。
我即将呈现的解决方案效率极低,受到限制条件的影响,注定会超时。然而,这两种解决方案唯一的区别(至少在我看来/理解的范围内)是一个使用
我是一名有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:
我即将呈现的解决方案效率极低,受到限制条件的影响,注定会超时。然而,这两种解决方案唯一的区别(至少在我看来/理解的范围内)是一个使用
std :: map<long long,bool>
,而另一个使用std :: set <long long>
(请参见最后一个循环的开始。其余部分相同,您可以通过任何diff工具进行检查)。映射解决方案会导致“测试3超时”,而集合解决方案会导致“测试2超时”,这意味着测试2的情况下,映射解决方案比集合解决方案更快。如果我选择Microsoft Visual Studio 2010编译器,则是这种情况。如果我选择GCC,则两种解决方案都会导致在测试3上超时。我是一名有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:
我并不是在询问如何高效地解决问题。我想问的是,如何解释使用 std::map
显然比使用 std::set
更有效率。我无法理解这种现象的机制,希望有人能够提供任何见解。
Code1(使用 map,TLE 3):
#include <iostream>
#include <map>
#include <string>
#include <vector>
using namespace std;
int main ()
{
string s;
cin >> s;
vector <long long> p;
p.push_back(1);
for (int i = 1; i < s.size(); i++)
p.push_back(31 * p[i - 1]);
vector <long long> hash_temp;
hash_temp.push_back((s[0] - 'a' + 1) * p[0]);
for (int i = 1; i < s.size(); i++)
hash_temp.push_back((s[i] - 'a' + 1) * p[i] + hash_temp[i - 1]);
int n = s.size();
int answer = 0;
for (int i = 1; i <= n; i++)
{
map <long long, bool> hash_ans;
for (int j = 0; j < n - i + 1; j++)
{
if (j == 0)
hash_ans[hash_temp[j + i - 1] * p[n - j - 1]] = true;
else
hash_ans[(hash_temp[j + i - 1] - hash_temp[j - 1]) * p[n - j - 1]] = true;
}
answer += hash_ans.size();
}
cout << answer;
}
代码2(使用set,TLE 2):
#include <iostream>
#include <string>
#include <vector>
#include <set>
using namespace std;
int main ()
{
string s;
cin >> s;
vector <long long> p;
p.push_back(1);
for (int i = 1; i < s.size(); i++)
p.push_back(31 * p[i - 1]);
vector <long long> hash_temp;
hash_temp.push_back((s[0] - 'a' + 1) * p[0]);
for (int i = 1; i < s.size(); i++)
hash_temp.push_back((s[i] - 'a' + 1) * p[i] + hash_temp[i - 1]);
int n = s.size();
int answer = 0;
for (int i = 1; i <= n; i++)
{
set <long long> hash_ans;
for (int j = 0; j < n - i + 1; j++)
{
if (j == 0)
hash_ans.insert(hash_temp[j + i - 1] * p[n - j - 1]);
else
hash_ans.insert((hash_temp[j + i - 1] - hash_temp[j - 1]) * p[n - j - 1]);
}
answer += hash_ans.size();
}
cout << answer;
}