zoukankan      html  css  js  c++  java
  • 洛谷 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大算法
    ant google compiler 压缩
    美工资源
    面试题
    validate表单验证插件
    laypage分页
    layer弹出框小结
    Thymeleaf
    webApp开发
    grunt自动化构建工具
  • 原文地址:https://www.cnblogs.com/fusiwei/p/11436594.html
Copyright © 2011-2022 走看看