BZOJ_3448_[Usaco2014 Feb]Auto-complete_Trie

Description

Bessie the cow has a new cell phone and enjoys sending text messages, although she keeps making spelling errors since she has trouble typing on such a small screen with her large hooves. Farmer John has agreed to help her by writing an auto-completion app that takes a partial word and suggests how to complete it. The auto-completion app has access to a dictionary of W words, each consisting of lowercase letters in the range a..z, where the total number of letters among all words is at most 1,000,000. The app is given as input a list of N partial words (1 <= N <= 1000), each containing at most 1000 lowercase letters. Along with each partial word i, an integer K_i is also provided, such that the app must find the (K_i)th word in alphabetical order that has partial word i as a prefix. That is, if one ordered all of the valid completions of the ith partial word, the app should output the completion that is (K_i)th in this sequence.

XYW在和他的男人聊天的时候经常会因为打字速度太慢而被鄙视,于是他想开发一种自动补全软件。开始他有一个包含了w个词的字典(总长度不大于10^6)。接下来他想知道在字典中可以由给定的字符串s加上若干个字母得到的字符串字典序第k大的编号是多少?有n组询问(n<=10^3,s长度<=10^3)

Input

* Line 1: Two integers: W and N.

* Lines 2..W+1: Line i+1: The ith word in the dictionary.

* Lines W+2..W+N+1: Line W+i+1: A single integer K_i followed by a partial word.

Output

* Lines 1..N: Line i should contain the index within the dictionary (an integer in the range 1..W) of the (K_i)th completion (in alphabetical order) of the ith partial word, or -1 if there are less than K_i completions.

Sample Input

10 3
dab
ba
ab
daa
aa
aaa
aab
abc
ac
dadba
4 a
2 da
4 da

Sample Output

3
1
-1


并没有想到排序加二分。。

直接对所有串建立trie树,维护子树siz,这样我们查询的时候从a开始查然后不断减K即可。

BZ上面加强了数据,直接这么做会T死。

考虑优化:对于Trie树上那些非叶子节点且只有一个儿子的点,可以直接合并到下面的结点上去。。

这个玩意是我受到后缀树的启发bb出来的,复杂度也不会证,应该可以卡掉。

BZ的数据字符总数可能超过1000000。开2100000就够了(我这个做法是这样

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 2100050
int t[N],ch[N][26],W,n,cnt=1,flg[N],fa[N],is[N],vis[N];
char w[N];
void insert(int idx) {
int p=1,i;
for(i=1;w[i];i++) {
int &k=ch[p][w[i]-'a'];
if(!k) k=++cnt;
p=k;
t[p]++;
if(!flg[p]&&!vis[p]) flg[p]=idx;
else if(!is[p]) flg[p]=0,vis[p]=1;
}
is[p]=1;
flg[p]=idx;
}
int query(int p,int k) {
if(k==1&&flg[p]) return flg[p];
int i;
int now=is[p];
for(i=0;i<26;i++) {
now+=t[ch[p][i]];
if(now>=k) {
return query(ch[p][i],k-now+t[ch[p][i]]);
}
}
return flg[p];
}
int main() {
scanf("%d%d",&W,&n);
int i,j,sum=0;
for(i=1;i<=W;i++) {
scanf("%s",w+1);
insert(i);
// sum+=strlen(w+1);
}
// printf("%d\n",sum); return 0;
int K;
for(i=1;i<=n;i++) {
scanf("%d%s",&K,w+1);
int p=1,flg=1;
for(j=1;w[j];j++) {
if(!ch[p][w[j]-'a']) {flg=0; break;}
p=ch[p][w[j]-'a'];
}
if(!flg||t[p]<K) puts("-1");
else printf("%d\n",query(p,K));
}
}

BZOJ_3448_[Usaco2014 Feb]Auto-complete_Trie树的更多相关文章

  1. BZOJ 3446: [Usaco2014 Feb]Cow Decathlon( 状压dp )

    水状压dp. dp(x, s) = max{ dp( x - 1, s - {h} ) } + 奖励(假如拿到的) (h∈s). 时间复杂度O(n * 2^n) ------------------- ...

  2. bzoj3446[Usaco2014 Feb]Cow Decathlon*

    bzoj3446[Usaco2014 Feb]Cow Decathlon 题意: FJ有n头奶牛.FJ提供n种不同的技能供奶牛们学习,每头奶牛只能学习一门技能,每门技能都要有奶牛学习. 第i头奶牛学习 ...

  3. BZOJ3448 : [Usaco2014 Feb]Auto-complete

    RE了几十发,实在没办法了…只好向管理员要数据,然后发现数据规模与题目描述不符… 建立Trie并求出DFS序,同时根据DFS序确定字典序 然后每次询问相当于询问子树第k小,用主席树维护,注意压缩内存 ...

  4. 【BZOJ 3445】【Usaco2014 Feb】Roadblock

    http://www.lydsy.com/JudgeOnline/problem.php?id=3445 加倍的边一定在最短路上(否则继续走最短路). 最短路长度是O(n)的,暴力扫最短路上的每条边, ...

  5. BZOJ 3445: [Usaco2014 Feb] Roadblock

    Description 一个图, \(n\) 个点 \(m\) 条边,求将一条边距离翻倍后使 \(1-n\) 最短路径增加的最大增量. Sol Dijstra. 先跑一边最短路,然后枚举最短路,将路径 ...

  6. [BZOJ3449] [Usaco2014 Feb]Secret Code

    Description Farmer John has secret message that he wants to hide from his cows; the message is a str ...

  7. [Usaco2014 Feb] Roadblock

    有一个无向图,共N个节点,编号1至N,共M条边.FJ在节点1,它想到达节点N.FJ总是会选择最短路径到达节点N .作为捣蛋的奶牛Bessie,它想尽量延迟FJ到达节点N的时间,于是Bessie决定从M ...

  8. BZOJ-USACO被虐记

    bzoj上的usaco题目还是很好的(我被虐的很惨. 有必要总结整理一下. 1592: [Usaco2008 Feb]Making the Grade 路面修整 一开始没有想到离散化.然后离散化之后就 ...

  9. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

随机推荐

  1. hexo干货系列:(五)hexo添加站内搜索

    前言 本来想用百度站内搜索,但是没成功,所以改用swiftype,用起来还是很棒的,这里分享一下我的安装步骤 正文 注册 去swiftype官网注册个账号,然后登陆,对了不要去在意30天试用,30天过 ...

  2. spring几种依赖注入方式以及ref-local/bean,factory-bean,factory-method区别联系

    平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程 ...

  3. .NET 调用java webservice保存datetime类型数据为空的解决办法

    问题描述:       用C#.NET调用Java开发的WebService时,先在客户端封装的带有int属性的对象,当将该对象传到服务器端时,服务器端可以得到 string类型的属性值,却不能得到i ...

  4. TYVJ P 1214 硬币问题

    TYVJ  P 1214 硬币问题 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述   有n种硬币,面值为别为a[1],a[2],a[3]……a[n],每种都 ...

  5. Android应用程序项目结构

    Android应用程序项目结构 [src]:JAVA源代码目录 [gen]:由系统自动生成的JAVA源码文件,不可修改,只可查看和使用 加载的和依赖的类库 [assets]:本地存储文件的一个文件夹 ...

  6. SystemInformationRequestHandlers

    SystemInformationRequestHandlers - Solr Wiki Search: Solr Wiki Login SystemInformationRequestHandler ...

  7. java内存区域和对象的产生

    一直被java中内存组成弄的头晕眼花,这里总结下都有哪些,先上图片 程序计数器 小块内存,线程执行字节码的信号指示器,以此获取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复都要依赖他 ...

  8. win10安装mysql5.6,mysql启动时,闪退

    首先在服务中查看是不是mysql启动了 发现在服务中没有mysql服务, 然后找到mysql的安装目录 MYSQL SERVER 5.6 中将my-default.ini 改为my.ini 使用命令行 ...

  9. 基于GDAL的栅格图像空间插值预处理

    转自 基于GDAL的栅格图像空间插值预处理——C语言版 基于GDAL的栅格图像预处理 前言 栅格数据和矢量数据构成空间数据的主要来源,怎样以开源方式读取并处理这些空间数据?目前有多种开源支持包,这里只 ...

  10. [Analytics] Add Tealium debugger in Chrome

    It would be helpful once you can see what information have been tracking inside you web application, ...