csp信奥赛C++高频考点专项训练之字符串 --【字符串排序】:合并序列

题目描述
有 N N N 个单词和字符串 T T T,按字典序输出以字符串 T T T 为前缀的所有单词。
输入格式
输入文件第一行包含一个正整数 N N N;
接下来 N N N 行,每行一个单词,长度不超过 100 100 100;
最后一行包含字符串 T T T。
输出格式
按字典序升序输出答案。
输入输出样例 1
输入 1
6
na
no
ki
ki
ka
ku
k
输出 1
ka
ki
ki
ku
说明/提示
【数据规模】
对于 60 % 60\% 60% 的数据,满足 1 ≤ N ≤ 1000 1 \le N \le 1000 1≤N≤1000;
对于 100 % 100\% 100% 的数据,满足 1 ≤ N ≤ 100000 1 \le N \le 100000 1≤N≤100000 且所有字符均为小写字母。
思路分析
题目要求输出所有以给定字符串 ( T ) 为前缀的单词,并按字典序升序排列。
最直接的方法:
- 将所有单词读入数组。
- 遍历每个单词,检查其前
len(T)个字符是否与T相等(需先保证单词长度 ≥len(T))。 - 将符合条件的单词存入另一个数组。
- 对该数组进行排序(默认字典序)。
- 依次输出。
时间复杂度为 O ( N ⋅ L + M log M ) O(N \cdot L + M \log M) O(N⋅L+MlogM),其中 ( N ) 为单词总数,( L ) 为单词平均长度(≤100),( M ) 为符合条件单词数。
空间复杂度 O(N)。
对于 N ≤ 100000 N \le 100000 N≤100000 的数据完全可行,且代码实现简洁。
代码实现
cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
int n; cin >> n; // 读入单词个数
vector<string> a(n); // 存储所有单词
for (int i = 0; i < n; i++) cin >> a[i]; // 读入每个单词
string t; cin >> t; // 读入前缀T
vector<string> b; // 存储符合前缀条件的单词
for (string s : a) { // 遍历每个单词
if (s.size() >= t.size() && s.compare(0, t.size(), t) == 0) // 检查是否以T开头
b.push_back(s); // 是则加入答案集合
}
sort(b.begin(), b.end()); // 按字典序升序排序
for (string s : b) cout << s << '\n'; // 输出结果
return 0;
}
功能分析
- 输入处理 :先读入整数 ( N ),接着读入 ( N ) 个单词存入
vector<string> a,最后读入前缀字符串t。 - 前缀筛选 :遍历
a中每个单词s,若s长度不小于t且s的前t.size()个字符与t完全相同,则将s加入结果容器b。 - 排序输出 :对
b调用sort进行字典序升序排序,最后逐行输出。 - 正确性:保留了重复单词,严格按字典序输出,满足题目要求。
- 效率 :单次比较仅需 O ( L ) O(L) O(L) 时间,排序 O ( M log M ) O(M \log M) O(MlogM)。
【完整系列请查看专栏】:
信奥赛C++普及组CSP-J一等奖通关刷题题单及题解:
https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转
各种学习资料,助力大家一站式学习和提升!!!
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"########## 一站式掌握信奥赛知识! ##########";
cout<<"############# 冲刺信奥赛拿奖! #############";
cout<<"###### 课程购买后永久学习,不受限制! ######";
return 0;
}
【秘籍汇总】(完整csp信奥赛C++学习资料):
1、csp/信奥赛C++,完整信奥赛系列课程(永久学习):
https://edu.csdn.net/lecturer/7901 点击跳转

2、CSP信奥赛C++竞赛拿奖视频课:
https://edu.csdn.net/course/detail/40437 点击跳转

https://edu.csdn.net/course/detail/41081 点击跳转

3、csp信奥赛高频考点知识详解及案例实践:
CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转
CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转
信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html 点击跳转
4、csp信奥赛冲刺一等奖有效刷题题解:
信奥赛C++普及组CSP-J一等奖通关刷题题单及题解:
https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转
信奥赛C++提高组csp-j初赛&复赛真题题解(持续更新): https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转
信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13125089.html 点击跳转
5、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转

GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html 点击跳转
· 文末祝福 ·
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"跟着王老师一起学习信奥赛C++";
cout<<" 成就更好的自己! ";
cout<<" csp信奥赛一等奖属于你! ";
return 0;
}