【solution】JZOJ-5795 词典

题面

Description

小C有$n$个字符串$T_1 T_n$,给出$m$个询问

第$i$个询问给出一个字符串$S_i$,对于每个询问,我们可以得到一个长度为$n$的$bool$数组$a$,其中$a_i=(S_i$是否为$T_i$的前缀$)$

例如,$a=[0,0,1]$表示$S_i$是$T_3$的前缀,但不是$T_1,T_2$的前缀。

对于每个询问给出的$a$数组,你的任务就是求出它最长的全$0$子串长度

Input

第一行两个数n,m,表示有n个字符串,m个询问。
接下来n行,每行一个字符串Ti 。
再接下来m行,每行一个字符串Si 。

Output

对于每个询问,输出一个ansi表示答案。

Sample Input

3 2
abcabc
aabc
abbc
aa
ba

Sample Output

1
3

Data Constraint




分割线




这是一个玄学的题目,有几种基于字典树(Trie)的做法,在考试的时候本蒟蒻在考场上一个小时一发手打出了数据不随机都没关系的在线做法,然鹅并没有什么卵用,统计的时候Trie爆了直接爆零




又是分割线




解法1:

这是一个离线做法(据说是标程???)

先读入数据(然鹅不用C++string难道不会爆数组吗)

再对查询建字典树,对模板串在字典树上跑一下,暴力求结果

解法2:

这貌似是一个在线的做法

对模板串建Trie,每次对询问串在字典树上跑一下,对下面的剩下部分暴力搜结果

这个的正确性就是因为数据是随机的,所以树高不会很大,因此就不会TLE了

正解来了!!!!

这是一个正常的玄学的做法,能够在不随机的数据上成功跑完,时间复杂度等于输入大小。考试的时候竟然被我想出来了(捂脸)

解题思路

对输入的模板串建一棵字典树,每个节点要存他的指向三个孩子的指针(这里用数组模拟),lst(上一次访问到这个节点的模板串编号,初始化为1),ans(这个节点的答案)。在每次添加模板串的时候暴力维护答案:如果当前访问的序号与上次的序号lst不相邻的话就用index-lst-1更新答案。在所有的模板串都添加完后再对所有的节点用n+1更新一下答案就可以了(这个很重要)。

查询的时候就把询问再字典树上跑一遍,如果不存在就直接输出n,存在的话就直接输出ans就好了

玄学的在线做法,复杂度是与输入规模相等的

121ms,119.50MB(主要是字典树节点)

(忽略注释掉的debug部分)

Code

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#define ll long long
#define maxn 1000005
using namespace std;
int n,m;
struct Trie{
int num;
int lst,ans;
int nxt[3];
Trie(){
lst=0;
ans=0;
nxt[0]=-1;
nxt[1]=-1;
nxt[2]=-1;
}
}node[maxn*5];
int tot=1;
char p[maxn*5];
int gmax(int a,int b){return a>b?a:b;}
void add(char a[],int index){
int len=strlen(a),np=0;
for(int i=0;i<len;i++){
int nc=a[i]-'a';//cout<<nc<<' ';
if(node[np].nxt[nc]==-1){
node[np].nxt[nc]=tot;
node[tot]=Trie();
node[tot].num=nc;
tot++;
//cout<<index<<endl;
}
//if(nc==1) cout<<index<<' '<<node[np]<<endl;
np=node[np].nxt[nc];
int last=node[np].lst;
if(index!=last+1){
int cnt=index-last-1;
node[np].ans=gmax(node[np].ans,cnt);
//cout<<index<<endl;
}
node[np].lst=index;
}
//cout<<endl;
return;
}
void update(){
int index=n+1;
for(int i=1;i<tot;i++){
int cnt=index-node[i].lst-1;
node[i].ans=gmax(node[i].ans,cnt);
}return;
}
int query(char a[]){
int len=strlen(a),np=0;
for(int i=0;i<len;i++){
int c=a[i]-'a';
if(node[np].nxt[c]==-1){
return n;
}
else{
np=node[np].nxt[c];
}
}
//cout<<np<<' ';
return node[np].ans;
}
int main(){
freopen("word.in","r",stdin);
freopen("word.out","w",stdout);
scanf("%d %d",&n,&m);
node[0]=Trie();
for(int i=1;i<=n;i++){
scanf("%s",p);
add(p,i);
//cout<<i<<' '<<node[480].ans<<endl;
}
update();
for(int i=1;i<=m;i++){
scanf("%s",p);
printf("%d\n",query(p));
}
//for(int i=0;i<tot;i++){
// cout<<i<<' '<<node[i].nxt[0]<<' '<<node[i].nxt[1]<<' '<<node[i].nxt[2]<<endl;
//}
//cout<<tot<<endl;
return 0;
}

[solution] JZOJ-5795 词典的更多相关文章

  1. [solution] JZOJ 5459. 密室

    [solution] JZOJ 5459. 密室 Description 小X 正困在一个密室里,他希望尽快逃出密室. 密室中有$N$ 个房间,初始时,小X 在1 号房间,而出口在N 号房间. 密室的 ...

  2. 必应词典UWP版-开发小结

    摘要 必应词典UWP版已经上线2周了!相信有不少用户都已经体验过了吧!得益于Win10全新.强大的API,新版词典在性能上.UI体验上都有了大幅的提升,今天,小编就为大家讲讲必应词典UWP开发的故事. ...

  3. (已解决 7.8号)leecode 分词利用词典分词 word break

    不戚戚于贫贱,不汲汲于富贵      ---五柳先生 Given a string s and a dictionary of words dict, determine if s can be se ...

  4. [jzoj]3506.【NOIP2013模拟11.4A组】善良的精灵(fairy)(深度优先生成树)

    Link https://jzoj.net/senior/#main/show/3506 Description 从前有一个善良的精灵. 一天,一个年轻人B找到她并请他预言他的未来.这个精灵透过他的水 ...

  5. [jzoj]3468.【NOIP2013模拟联考7】OSU!(osu)

    Link https://jzoj.net/senior/#main/show/3468 Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: ...

  6. [Swift]LeetCode720. 词典中最长的单词 | Longest Word in Dictionary

    Given a list of strings words representing an English Dictionary, find the longest word in words tha ...

  7. [Swift]LeetCode953. 验证外星语词典 | Verifying an Alien Dictionary

    In an alien language, surprisingly they also use english lowercase letters, but possibly in a differ ...

  8. [jzoj]1115.【HNOI2008】GT考试

    Link https://jzoj.net/senior/#main/show/1115 Description 申准备报名参加GT考试,准考证号为n位数X1X2X3...Xn-1Xn(0<=X ...

  9. [jzoj]2538.【NOIP2009TG】Hankson 的趣味题

    Link https://jzoj.net/senior/#main/show/2538 Description Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫H ...

随机推荐

  1. Python全栈开发记录_第一篇(循环练习及杂碎的知识点)

    Python全栈开发记录只为记录全栈开发学习过程中一些难和重要的知识点,还有问题及课后题目,以供自己和他人共同查看.(该篇代码行数大约:300行) 知识点1:优先级:not>and 短路原则:a ...

  2. 解决spring-security session超时 Ajax 请求没有重定向的问题

    开始时, 代码是这样的: $.ajax({ type : "POST", url : sSource, cache : false, dataType : "json&q ...

  3. js day01

    一)什么是JavaScript[以下简称JS] JS是 (1)基于对象 JS本身就有一些现成的对象可供程序员使用,例如:Array,Math,String... JS并不排除你可以自已按一定的规则创建 ...

  4. grep -A -B -C 显示抓取的前后几行参数

    我经常用grep找东西,比如用户名和密码.大部分站点和用户名和密码都是在一样的,方便grep查找.有时,为了文本好看,我会放在多行.比如 wikipedia多个语言版本上有多个账号,就放在wikipe ...

  5. Citrix XenApp工作原理

    Citrix XenApp™作为一种Windows®应用交付系统,可在数据中心集中管理应用,并将应用按需交付给身处各地.使用各种设备的用户.利用集成的应用虚拟化技术,XenApp克服了传统应用部署方法 ...

  6. ADO.NET 基本操作

    概要 ADO.NET是.NET框架中的重要组件,主要用于完成C#应用程序访问数据库,类似于PHP中的PDO 使用 连接数据库 (Connection对象) 1. 连接字符串 基本语法:数据源(Data ...

  7. IDEA(MAC) 快捷键

    从eclipse到IDEA:从Windows到MAC 有些不习惯,记录一些日常使用的快捷键 1.格式化代码 command+alt+L 2.导包 alt+ enter 3.自动生成该类型的对象 com ...

  8. 应用脚手架创建一个React项目

    安装脚手架,这里会自动安装到你的nodejs里面 npm install create-react-app -g 进入创建目录 我这里创建一个为 react03的项目,等待下载..... create ...

  9. IP路由配置之---------dhcp服务器配置

    实验设备:一台华三路由器,一台PC 步骤一,在系统视图下打开dhcp功能,禁用IP(网关,域名服务器) [H3C]dhcp enable # [H3C]dhcp server forbidden-ip ...

  10. mysql授权远程访问

    mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY '123456' WITH GRANT OPTION; Query O ...