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;
}
相关推荐
A_humble_scholar16 小时前
C++11 学习笔记:统一初始化、右值引用与完美转发
c++·笔记·学习
叶子野格16 小时前
《C语言学习:位运算》17
c语言·开发语言·c++·学习·visual studio
晚风吹红霞17 小时前
C++ stack 和 queue 完全指南:适配器模式与双端队列的奥秘
c++·算法·适配器模式
代码改善世界17 小时前
【C++进阶】红黑树模拟实现mymap和myset
开发语言·c++
断点之下18 小时前
从C的struct到C++的class:封装、this指针、三大特性入门
开发语言·c++
誰能久伴不乏18 小时前
工业级 Modbus 上位机架构:基于滴答引擎与状态锁的高并发调度器
c++·qt·架构
谷谷地图下载器18 小时前
全球、台湾省的无水印·街景数据(离线数据),专为可视化项目定制,支持国产化
javascript·c++·3d·arcgis·sqlite
程序大视界18 小时前
【C++ 从基础到项目实战】C++(五):类与对象基础——构造、析构与访问控制
开发语言·c++·cpp
代码中介商18 小时前
掌握C++ std::bind:参数绑定与灵活调用
开发语言·c++
数据法师18 小时前
Crow Translate :开源桌面划词翻译工具
c++·qt·开源