atcoder beginner contest 后缀数组例题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

atcoder beginner contest 后缀数组例题
以下是一道与后缀数组相关的AtCoder Beginner Contest上的例题解析:
问题描述:
给定一串长度为 N(1 ≤ N ≤ 10^5)的字符串 S,求字符串 S 的所有后缀排序后的字符串列表。

解题思路:
这道题可以使用后缀数组来解决。

后缀数组是一个字符串的所有后缀按照字典序排序后的数组。

首先,我们可以将字符串 S 的所有后缀存到一个数组中,并对这个数组进行排序。

为了实现这一步,我们可以使用一个结构体来存储每个后缀的起始索引和后缀本身。

然后,我们可以使用 C++ 中的 sort 函数对该数组进行排序,排序的比较函数为根据后缀字符串的字典序大小。

接下来,我们只需要遍历排序后的数组,并将每个后缀的后缀字符串输出即可。

下面是一个使用C++实现的解法示例:
```cpp
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
struct Suffix {
int index;
string suffix;
};
bool compareSuffix(Suffix a, Suffix b) {
return a.suffix < b.suffix;
}
vector<string> getSuffixArray(string S) {
int N = S.size();
vector<string> suffixArray;
vector<Suffix> suffixes;
for (int i = 0; i < N; i++) {
suffixes.push_back({i, S.substr(i)});
}
sort(suffixes.begin(), suffixes.end(), compareSuffix); for (Suffix suffix : suffixes) {
suffixArray.push_back(suffix.suffix);
}
return suffixArray;
}
int main() {
string S;
cin >> S;
vector<string> suffixArray = getSuffixArray(S);
for (string suffix : suffixArray) {
cout << suffix << endl; // 输出每个后缀字符串
}
return 0;
}
```
这个解法的时间复杂度为O(NlogN),其中N 是字符串的长度。

首先,我们需要遍历字符串S 的所有后缀并存储到结构体中,时间复杂度为 O(N)。

然后,对结构体数组进行排序,时间复
杂度为 O(NlogN)。

最后,遍历排序后的数组输出结果,时间
复杂度为 O(N)。

整体的时间复杂度取决于对结构体数组的排序,因此总的时间复杂度为 O(NlogN)。

相关文档
最新文档