• 洛谷 P1628 合并序列


    洛谷 P1628 合并序列

    题目传送门

    题目描述

    有N个单词和字符串T,按字典序输出以字符串T为前缀的所有单词。

    输入格式

    输入文件第一行包含一个正整数N;

    接下来N行,每行一个单词,长度不超过100;

    最后一行包含字符串T。

    【数据规模】

    对于60%的数据,满足1≤N≤1000;

    对于100%的数据,满足1≤N≤100000且所有字符均为小写字母;

    输出格式

    按字典序升序输出答案。

    输入输出样例

    输入 #1复制

    输出 #1复制

    题解:

    这道题有多种方法:

    字典树(Trie树)、排序、二叉堆...

    正解应该是字典树(来自教练和大佬的指点)可惜我不会

    所以我们考虑一种朴素方法:

    处理输入的单词和前缀关键词的匹配,如果匹配上了就加入要排序的一个数组中,没匹配上就不用管,因为C++的sort函数是支持字符串排序的(当然要用C++STL中的string容器),所以就可以保证正确性。

    而且时间也可以过。

    那么,我们还可以用堆进行数据结构处理。实现原理和上面那个大同小异。因为小根堆(这里用优先队列实现)也可以维护一个字符串的字典序。

    比较一下这两种做法:

    排序的时间复杂度比较高,但是码量少,容易想。二叉堆的常数大,如果不开O2的话奇慢无比容易被卡,但大多数时候要更优秀一些。而且可以用于装b

    代码:

    #include<cstdio>
    #include<string>
    #include<queue>
    #include<vector>
    #include<iostream>
    using namespace std;
    const int maxn=1e5+1;
    int n;
    string s[maxn],k;
    priority_queue<string,vector<string>,greater<string> >q;
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            cin>>s[i];
            q.push(s[i]);
        }
        cin>>k;
        for(int i=1;i<=n;i++)
        {
            int cnt=0;
            string a=q.top();
            q.pop();
            for(int j=0;j<k.size();j++)
                if(a[j]==k[j])
                    cnt++;
            if(cnt==k.size())
                cout<<a<<endl;
        }
        return 0;
    }
    
  • 相关阅读:
    10.并发包阻塞队列之ArrayBlockingQueue
    【PHP】最详细PHP从入门到精通(三)——PHP中的数组
    新随笔222
    新随笔
    iOS常用加密算法介绍和代码实践
    5.在MVC中使用泛型仓储模式和工作单元来进行增删查改
    Directx11学习笔记【二十】 使用DirectX Tool Kit加载mesh
    什么是Dagger2
    嗯嗯

  • 原文地址:https://www.cnblogs.com/fusiwei/p/11436594.html
Copyright © 2020-2023  润新知