HZOI String STL的正确用法
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的正确用法的更多相关文章
- C# string.Split对于换行符的分隔正确用法
C# string.Split对于换行符的分隔正确用法 tmpCase "11117144-8c91-4817-9b92-99ec2f9d784a\r\n23D95A26-012C-4332 ...
- Spring MVC中Session的正确用法<转>
Spring MVC是个非常优秀的框架,其优秀之处继承自Spring本身依赖注入(Dependency Injection)的强大的模块化和可配置性,其设计处处透露着易用性.可复用性与易集成性.优良的 ...
- C#中dynamic的正确用法
C#中dynamic的正确用法 http://www.cnblogs.com/qiuweiguo/archive/2011/08/03/2125982.html dynamic是FrameWork4 ...
- 【转】Spring MVC中Session的正确用法之我见
Spring MVC是个非常优秀的框架,其优秀之处继承自Spring本身依赖注入(Dependency Injection)的强大的模块化和可配置性,其设计处处透露着易用性.可复用性与易集成性.优良的 ...
- java String.split()函数的用法分析
java String.split()函数的用法分析 栏目:Java基础 作者:admin 日期:2015-04-06 评论:0 点击: 3,195 次 在java.lang包中有String.spl ...
- C#中dynamic的正确用法 以及 typeof(DynamicSample).GetMethod("Add");
dynamic是FrameWork4.0的新特性.dynamic的出现让C#具有了弱语言类型的特性.编译器在编译的时候不再对类型进行检查,编译期默认dynamic对象支持你想要的任何特性.比如,即使你 ...
- C#中dynamic、ExpandoObject 的正确用法
原文地址:http://www.cnblogs.com/qiuweiguo/archive/2011/08/03/2125982.html dynamic是FrameWork4.0的新特性.dynam ...
- C#中dynamic的正确用法【转】
dynamic是FrameWork4.0的新特性.dynamic的出现让C#具有了弱语言类型的特性.编译器在编译的时候不再对类型进行检查,编译期默认dynamic对象支持你想要的任何特性.比如,即使你 ...
- Spring MVC中Session的正确用法之我见
Spring MVC是个非常优秀的框架,其优秀之处继承自Spring本身依赖注入(Dependency Injection)的强大的模块化和可配置性,其设计处处透露着易用性.可复用性与易集成性.优良的 ...
随机推荐
- PHP中判断变量为空的几种方法小结
isset 主要用来判断变量是否被初始化过empty 可以将值为 "假"."空"."0"."NULL"." ...
- python学习之对象的三大特性
在面向对象程序设计中,对象可以看做是数据(特性)以及由一系列可以存取.操作这些数据的方法所组成的集合.编写代码时,我们可以将所有功能都写在一个文件里,这样也是可行的,但是这样不利于代码的维护,你总不希 ...
- 使用Entity Framework出错
在使用的过程中,写了一个例子,结果就报错说 The context cannot be used while the model is being created. 在 ...
- c++ constructor, copy constructor, operator =
// list::push_back #include <iostream> #include <list> class element{ private: int numbe ...
- js数字格式化千分位格式
带小数点的 var a = 8462948.2453; console.log(a.toLocaleString()) //8,462,948.245 不带小数点的 num.toString().re ...
- 每天一个Linux命令(12):su命令
su命令用于切换当前用户身份到其他用户身份,变更时须输入所要变更的用户帐号与密码. 语法: su(选项)(参数) 选项: -c<指令>或--command=<指令>:执行完指定 ...
- VMware快照
越来越多的人喜欢使用虚拟机来做实验,但是实验过程并不总是顺利的,所以我们就需要掌握虚拟机快照的使用方法,个人建议的顺序为: 1 在虚拟机打开之前,点击“虚拟机”--"快照"--&q ...
- C 计算金额
#include <stdio.h> int main(int argc, char **argv) { \\定义两个变量 a金额 z跟票面 int a=0; int z=0;\\ 输入金 ...
- python3.6 新特性学习
#支持类型提示 typing { def greeting(name: str) -> str: return 'Hello ' + name #在函数greeting中,参数名称的类型为str ...
- QR码与DM码的区别
DM无法表现汉字等其他形式,而QR码能用数据压缩方式来表示汉字,仅用13bit即可表示一个汉字,比其他二维条码表示汉字的效率提高了20%.相较而言,DM码信息容量小,应用简单.而QR在汉字处理上更有优 ...