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

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 ) 为前缀的单词,并按字典序升序排列。

最直接的方法:

  1. 将所有单词读入数组。
  2. 遍历每个单词,检查其前 len(T) 个字符是否与 T 相等(需先保证单词长度 ≥ len(T))。
  3. 将符合条件的单词存入另一个数组。
  4. 对该数组进行排序(默认字典序)。
  5. 依次输出。

时间复杂度为 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 长度不小于 ts 的前 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;
}
相关推荐
handler012 小时前
UDP协议与网络通信知识点
c语言·网络·c++·笔记·网络协议·udp
神仙别闹2 小时前
基于QT(C++)实现学生成绩管理系统
数据库·c++·qt
君义_noip3 小时前
CSP-S 2025 入门级 第一轮(初赛) 完善程序(1)
c++·算法·信息学奥赛·初赛·csp 第一轮
蜡笔小马5 小时前
07.C++设计模式-组合模式
c++·设计模式·组合模式
liulilittle5 小时前
TCP UCP v1.0:BBR 的非破坏性约束层
网络·c++·网络协议·tcp/ip·算法·c·通信
每天回答3个问题5 小时前
leetcodeHot100 | 104.二叉树的最大深度
c++·面试·
坚果派·白晓明5 小时前
【鸿蒙PC三方库移植适配框架解读系列】第五篇:完整流程图与角色职责
c语言·c++·华为·harmonyos·鸿蒙
xiao_li_ya6 小时前
C++学习日记1(`*`的理解、const关键词)
开发语言·c++
郝学胜-神的一滴8 小时前
Qt 入门 01-02: 开发环境搭建指南
开发语言·c++·qt·客户端