【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. JavaWeb——jsp-config

    <jsp-config> 包括 <taglib> 和 <jsp-property-group> 两个子元素.其中<taglib> 元素在JSP 1.2 ...

  2. 小程序打开pdf

    wx.downloadFile({ url:"https://xxxxxx.pdf", success(res){ console.log(res) let data = res. ...

  3. BZOJ 2173 luoguo P4451 [国家集训队]整数的lqp拆分

    整数的lqp拆分 [问题描述] lqp在为出题而烦恼,他完全没有头绪,好烦啊… 他首先想到了整数拆分.整数拆分是个很有趣的问题.给你一个正整数N,对于N的一个整数拆分就是满足任意m>0,a1 , ...

  4. android 开发 View _8_ 动态图片自定义View

    转载地址:https://blog.csdn.net/mengks1987/article/details/77770922 先来看下效果: 是不是有一种熟悉感,其实这种效果使用序列帧动画也是可以实现 ...

  5. gopath环境变量设置

    #在国内镜像下载二进制包 wget -c  http://www.golangtc.com/static/go/go1.4.1.linux-amd64.tar.gz tar -C /usr/local ...

  6. 2Linux常用命令-Liunu就该这么学

    常用系统工作命令 1.echo 用于在终端输出字符串或变量提取后的值,格式为“echo [字符串 | $变量]” 2.date date "+%Y-%m-%d %H:%M:%S" ...

  7. hadoop分布式集群搭建(2.9.1)

    1.环境 操作系统:ubuntu16 jdk:1.8 hadoop:2.9.1 机器:3台,master:192.168.199.88,node1:192.168.199.89,node2:192.1 ...

  8. Centos安装ffmpeg

    yum install -y ffmpeg 使用上面的命令安装却出现以下问题: Google后发现缺少一些扩展: wget https://download1.rpmfusion.org/free/e ...

  9. Linux命令:unlias

    语法 unalias [-a] name [name ...] 说明 取消别名. 可以一次取消多个别名,写几个取消几个.不写,取消所有别名. 参数 -a 取消所有别名,不论后面是否跟一个还是多个nam ...

  10. docker 网络配置

    先随便写几行命令 随后一点点的补充 端口映射实现访问容器. run -d -P training/webapp python app.py run -d -p 5000:5000 training/w ...