String          3s 512 MB
描述
硬盘中里面有n个文件,文件从1到n标号,每个文件可以用若干个数字序列来表示,而且每个文件存在一个重要值。现在请你完成一个搜索系统,有m
个搜索的操作,如果一个文件中有以这个数字序列为前缀的数字序列,那么这个文件会被搜索到,现在我们想知道会有多少个文件被搜索到,以及这
些文件中重要值前k小的是哪些。
输入
第一行两个数n,m。
接下来n行是对每个文件的描述(标号依次是1到n):
每行的前两个数字分别为描述这个文件的数字序列个数t和文件的重要值v。
接下来有t组数。
每组数先有一个数l,表示这个数字序列的长度。
接下来有l个数,表示这个序列。
接下来m行表示m个搜索操作:
每行的前两个数字分别为搜索数k和前缀长度l。
接下来l个数是这个前缀的数字序列。
输出
共m行。
每行来表示搜索的结果:
首先你需要输出有多少个文件会被搜索到。
接下来你需要输出k个数,依次是重要值前k小的标号(根据重要值由小到大输出,重要值相同时,标号小的排在前面)。
如果搜索到的文件数p比k小,那么你只需要输出p个,如果没有搜索到文件就不用输出了。
样例输入
5 5
1 1 5 1 2 3 4 5
1 2 5 1 2 4 5 3
1 8 5 2 1 4 3 2
1 9 5 2 1 8 5 2
1 1 5 1 2 3 4 5
2 2 1 2
3 2 1 2
4 2 1 2
4 2 2 1
1 2 2 1
样例输出
3 1 5
3 1 5 2
3 1 5 2
2 3 4
2 3
n,m<=50000,插入长度和与询问长度和<=200000


这道题很明显是个trie,但是数那么大不好定义儿子,我们可以在每个文件里建一棵trie但是这样的话总时间为10^10,行不通,那么我们就建一棵全局的trie我们把每个点都在其经过路径上放进去那么只会插入200000个点,而且开出来的trie点也不会超过200000,这样时间复杂度是200000,至于把每个数拆开,出题人说太麻烦......

这样的话我们可以直接把map当儿子,把set当节点储存,对于set,它里面有一个内置的东西是一个结束标志,就是在end()的时候输出的那个,当里面没有元素的的时候begin()就和end()一样了,那其实应该是个标记指针,对于pair要调iostream他有自动的先按第一关键字再按第二关键字的排序性质,而且它可以当做一种变量。

对于动态的trie来说,指针确实不太好打。

#include<set>
#include<iostream>
#include<map>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define MAXN 200050
using namespace std;
typedef pair<int,int> p;
set<p> s[MAXN];
set<p>::iterator it;
map<int,int>ch[MAXN];
inline int read()
{
int SUM=;
char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<='')
{
SUM=(SUM<<)+(SUM<<)+ch-'';
ch=getchar();
}
return SUM;
}
int n,m,tot=;
inline void insert(p x)
{
int l=read();
int now=;
while(l--)
{
int y=read();
if(!ch[now].count(y))ch[now][y]=++tot;
now=ch[now][y];
s[now].insert(x);
}
}
int need[MAXN];
int main()
{
freopen("string.in","r",stdin);
freopen("string.out","w",stdout);
n=read();
m=read();
for(int i=;i<=n;i++)
{
int t=read(),v=read();
for(int j=;j<=t;j++)
insert(make_pair(v,i));
}
for(int i=;i<=m;i++)
{
int k=read(),l=read(),now=;
for(int j=;j<=l;j++)need[j]=read();
int j;
for(j=;j<=l&&ch[now].count(need[j]);j++)
now=ch[now][need[j]];
if(j<=l)now=;
printf("%d ",s[now].size());
if(k>s[now].size())k=s[now].size();
for(j=,it=s[now].begin();j<=k;++it,j++)
printf("%d ",it->second);
printf("\n");
}
return ;
}

HZOI String STL的正确用法的更多相关文章

  1. C# string.Split对于换行符的分隔正确用法

    C# string.Split对于换行符的分隔正确用法 tmpCase "11117144-8c91-4817-9b92-99ec2f9d784a\r\n23D95A26-012C-4332 ...

  2. Spring MVC中Session的正确用法<转>

    Spring MVC是个非常优秀的框架,其优秀之处继承自Spring本身依赖注入(Dependency Injection)的强大的模块化和可配置性,其设计处处透露着易用性.可复用性与易集成性.优良的 ...

  3. C#中dynamic的正确用法

    C#中dynamic的正确用法  http://www.cnblogs.com/qiuweiguo/archive/2011/08/03/2125982.html dynamic是FrameWork4 ...

  4. 【转】Spring MVC中Session的正确用法之我见

    Spring MVC是个非常优秀的框架,其优秀之处继承自Spring本身依赖注入(Dependency Injection)的强大的模块化和可配置性,其设计处处透露着易用性.可复用性与易集成性.优良的 ...

  5. java String.split()函数的用法分析

    java String.split()函数的用法分析 栏目:Java基础 作者:admin 日期:2015-04-06 评论:0 点击: 3,195 次 在java.lang包中有String.spl ...

  6. C#中dynamic的正确用法 以及 typeof(DynamicSample).GetMethod("Add");

    dynamic是FrameWork4.0的新特性.dynamic的出现让C#具有了弱语言类型的特性.编译器在编译的时候不再对类型进行检查,编译期默认dynamic对象支持你想要的任何特性.比如,即使你 ...

  7. C#中dynamic、ExpandoObject 的正确用法

    原文地址:http://www.cnblogs.com/qiuweiguo/archive/2011/08/03/2125982.html dynamic是FrameWork4.0的新特性.dynam ...

  8. C#中dynamic的正确用法【转】

    dynamic是FrameWork4.0的新特性.dynamic的出现让C#具有了弱语言类型的特性.编译器在编译的时候不再对类型进行检查,编译期默认dynamic对象支持你想要的任何特性.比如,即使你 ...

  9. Spring MVC中Session的正确用法之我见

    Spring MVC是个非常优秀的框架,其优秀之处继承自Spring本身依赖注入(Dependency Injection)的强大的模块化和可配置性,其设计处处透露着易用性.可复用性与易集成性.优良的 ...

随机推荐

  1. html5 获取和设置data-*属性值的四种方法讲解

    1.获取id的对象 2.需要获取的就是data-id 和 dtat-vice-id的值 一:getAttribute()方法 const getId = document.getElementById ...

  2. SpringBoot学习(1)

    springboot的自动配置功能,主要流程如下: 1 启动的时候加载我们的主配置类,也就是我们的入口类:从而开启我们的自动配置配置功能,这个是通过@EnableAutoConfiguration注解 ...

  3. 2019-04-10 python入门学习——教材和工具准备

    # 从决定学习编程语言到正式做出计划挤出空余时间,历经一年半,因工作原因及生活原因不断搁浅,从湖北到浙江再回湖北,暂时稳定在一家小公司,从日常加班中压缩时间学习,于此记录学习进度.学习问题,在此过程中 ...

  4. linux文件IO操作篇 (二) 缓冲文件

    2. 缓冲文件操作 //规模较大 实时性低的文件 //当数据长度快要超过缓冲区的范围时,或者时间周期达到时,数据才被送往指定位置 //需要使用FILE * 作为文件标识符 //stdin 标准输入 / ...

  5. R语言绘图:直方图

    使用ggplot2包绘制直方图 ######*****绘制直方图代码*****####### data1 <- data0[(data0[, 2] <= 500) & (data0 ...

  6. CDH-5.9.2整合spark2

    1.编写目的:由于cdh-5.9.2自带spark版本是spark1.6,现需要测试spark2新特性,需要整合spark2, 且spark1.x和spark2.x可以同时存在于cdh中,无需先删除s ...

  7. leetcode笔记--2 reverse string

    my answer: 出错点:new_list[s] = list_s[u-1-s] 这样会出错, 重点:(1) map(str, s) 函数的使用,例:ls = [1,2,3]rs = map(st ...

  8. 【jQuery】 实用 js

    [jQuery] 实用 js 1. int 处理 parseInt(") // int 转换 isNaN(page) // 判断是否是int类型 2. string 处理 // C# str ...

  9. jmeter操作JDBC

    1. 依次添加计划.线程组.JDBC Connection Configuration.JDBC Request.HTTP请求.Debug Sampler.察看结果树 在计划中导入mysql的jdbc ...

  10. SSH公钥认证(码云)

    开发者向码云版本库写入最常用到的协议是 SSH 协议,因为 SSH 协议使用公钥认证,可以实现无口令访问,而若使用 HTTPS 协议每次身份认证时都需要提供口令.使用 SSH 公钥认证,就涉及到公钥的 ...